pythonでGUIを使って軽くアプリを作りたいなと思いtkinterを使ってみた。
初めてなので慣れずに使っているとよく分からんエラーで怒られた。
_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack
gridとpackとplaceを混在で使ってはいけない
tkinterでウィジェットの配置を行う際には、grid
, pack
, place
を駆使して行うのだが、どうやらこれらを混在させてはいけないようだ。packの部分をgridに置き換えるとあっさりエラーは解決した。
これで、問題なし??
と行きたいところだが、grid
, pack
, place
を使わないとうまく行かないという配置の仕方だってある。
すべて同じ配置メソッドで統一するには厳しい場合だってありますよ..。
そんなとき、いい情報を知った。
gridとpackとplaceは同じコンテナでは混在にできない
gridとpackとplaceは同じコンテナでは混在にできない。
↑つまりこれはどういうことなのかといいますと..。コンテナが別であればgrid
, pack
, place
の混在が認められるということ。
上記の_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by packエラーが表示される場合は以下のように
root = tkinter.Tk()
label1 = tkinter.Label(root, text='LABEL1').pack()
label2 = tkinter.Label(root, text='LABEL2').pack()
button1 = tkinter.Button(root, text='BUTTON1').grid(row=1, column=1)
button2 = tkinter.Button(root, text='BUTTON2').grid(row=1, column=2)
root.mainloop()
こんな感じでpackとgridを混在して使っていた。
それは、rootという同じコンテナで混在させて使っているから問題なのであって、
コンテナを別にしてあげれば意外とあっさり問題は解決される。
root = tkinter.Tk()
frame1 = tkinter.Frame(root)
label1 = tkinter.Label(frame1, text='LABEL1').pack()
label2 = tkinter.Label(frame1, text='LABEL2').pack()
frame1.pack()
frame2 = tkinter.Frame(root)
button1 = tkinter.Button(frame2, text='BUTTON1').grid(row=1, column=1)
button2 = tkinter.Button(frame2, text='BUTTON2').grid(row=1, column=2)
frame2.pack()
root.mainloop()
frame
で各コンテナを作成して、最終的にpack()でrootに配置するというイメージ。
ということで
_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by packの解決方法は
grid
,pack
,place
の混在をさせず、統一させるframe
で別コンテナに分けて、コンテナ内でgrid
,pack
,place
を駆使する
コメント