追記: 時間がたってからの追記ですみません。
https://teratail.com/questions/188436#reply-279726
にあるようにFrameの大きさをpackで親ウィジェットに合わせて拡張することが簡単にできることに気づきました。こちらの方法も参照ください!
Frameは複数の子供ウィジェットを配置できるコンテナウィジェットですが、子供をどのように配置するか適切に計算できるためには「全ての子供を同じ方法でレイアウトする必要がある」という点に注意が必要です。
本件の場合、appの子供として2つのボタンがありますが、一方をplaceで、もう一方をpackで配置しようとしています。そういうことはできません。全てをpack/place/gridのいずれか一種類の配置方法に統一してください。
また子供ウィジェットをplaceで配置する場合、Frameは「子供を配置するために自分の大きさがどのくらい大きくなければならないか」を自動計算できませんので、Frameの大きさは子供ウィジェットの配置に依存しない方法で望む大きさにせねばなりません。
ここで「実験」してみました
自分は「rootの大きさをgeometryで指定し、Frameをその大きさに合わせて自動拡張させる」ことが、Frameの配置でpack(expand=True)
とすれば可能と考えたのですが、実際にはダメでした。
そこで考え方を変えて、「Frameインスタンスの大きさをwidth, heightで指定しrootは子供であるFrameインスタンスの大きさに合わせて広がってくれる」という方法を取ってみたところ期待通りになりました。
Python
1import tkinter as tk
2
3def debug_conf(ev):
4 print(ev)
5
6class MainApp(tk.Frame):
7 def __init__(self, master):
8 # Frameの大きさを明示
9 super().__init__(master, width=1000, height=600)
10 self.bind('<Configure>', debug_conf) # for DEBUG
11 self.pack()
12 self.create_widgets()
13 # master.geometry('1000x600') # rootの大きさは指定しない
14
15 def create_widgets(self):
16 make_xline_button = tk.Button(self, text="make X-axis", command=self.say_hi)
17 make_xline_button.place(x=50, y=50)
18
19 quit_button = tk.Button(self, text="QUIT", fg="red", command=root.destroy)
20 quit_button.place(x=480, y=50) # こちらもplaceに変更
21
22 def say_hi(self):
23 print("hi")
24
25 def file_open(self):
26 print("opne")
27
28root = tk.Tk()
29app = MainApp(root)
30root.mainloop()
debug_confは前述の「実験」をする際のデバッグ用の関数です。このデバッグテクニックは「注目するウィジェットの大きさと位置が実際にどうなっているか」を確認するのに重宝します。こういうちょっとしたデバッグをすると「あ・・・ボタンを配置しても、Frame自体の大きさが1x1にしかなってないから子供が表示されないんだな・・・」といったことにすぐに気づけるため悩む時間を短縮できます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/30 03:06
2019/05/12 14:48