python Tkinter ボタン設置位置について

Python

まだTkinter始めて試行錯誤していたころに出会ったエラー

_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid

そのときのコード

import tkinter as tk

root = tk.Tk()           # tkオブジェクトを、rootに格納
root.title("sample_App") # アプリのタイトルを決定
root.geometry("600x400") # アプリ画面の大きさを設定

button_1 = tk.Button(root, text="1", font=("Arial", 20), padx=30, pady=30)
# 親ウィジェット=root ボタンに表示するテキスト=1 フォント="Arial", 18 X方向の内部間隔=30 Y方向の内部間隔=30
button_1.grid(row=0, column=0)
# 設置位置をグリッド指定 1行目 1列目

button_2 = tk.Button(root, text="1", font=("Arial", 20), padx=30, pady=30)
button_2.pack(side=tk.LEFT) # 端から設置(左)

button_3 = tk.Button(root, text="1", font=("Arial", 20), padx=30, pady=30)
button_3.pack(side=tk.RIGHT) # 端から設置(右)

button_4 = tk.Button(root, text="1", font=("Arial", 20), padx=30, pady=30)
button_4.pack(side=tk.BOTTOM) # 端から設置(下)

root.mainloop()          #メインループ実行、アプリスタート

調べた結果、ボタン設置の際に .grid と .pack は一緒に使えないらしいです
使う場合は以下のようにフレームで分けます

import tkinter as tk

root = tk.Tk()          
root.title("sample_App") 
root.geometry("600x400")

frame1 = tk.Frame(root) # frame1をrootに生成

button_1 = tk.Button(frame1, text="1", font=("Arial", 20), padx=30, pady=30)
# 設置場所をrootでなくframe1にする
button_1.grid(row=0, column=0)

frame1.grid(row=0, column=0) # frame1を.gridで設置

frame2 = tk.Frame(root) # frame2をrootに生成
button_2 = tk.Button(frame2, text="1", font=("Arial", 20), padx=30, pady=30)
# 設置場所をrootでなくframe2にする
button_2.pack(side=tk.LEFT)

button_3 = tk.Button(frame2, text="1", font=("Arial", 20), padx=30, pady=30)
button_3.pack(side=tk.RIGHT)

button_4 = tk.Button(frame2, text="1", font=("Arial", 20), padx=30, pady=30)
button_4.pack(side=tk.BOTTOM)

frame2.grid(row=1, column=0) # frame2を.gridで設置

root.mainloop()          #メインループ実行、アプリスタート

frame1とframe2の設置も .grid .pack .place を統一しなければなりません

ボタンをフレームの中に入れて、フレームをさらにアプリ画面(root)に設置する感じのイメージです

コメント