【python】tkinterでgridとpackとplaceを混在で扱いたい場合

  • URLをコピーしました!

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を駆使する

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次