我正在尝试使用Tkinter,因为我试图弄清楚有没有办法在不使用画布的情况下设置tkinter的窗口大小。我发现了如何set frame size question on SO's Question & Answer。所以我继续通过编写一个非常小的程序来测试它,以显示文本标签。但是当我使用frame.pack_propagate(0)
import tkinter as tk
root = tk.Tk()
frame = tk.Frame(root, width=400, height=400)
# Does not work at the moment, textBox is missing
# frame.pack_propagate(0)
frame.pack()
textBox = tk.Label(frame, text="(x,y): ")
textBox.pack()
root.mainloop()
所以我的问题是,你能解释为什么当我使用frame.pack_propagate(0)
代替frame.pack()
方法时,我的textBox(标签)没有显示出来吗?其次,有没有办法在不使用画布的情况下设置窗口大小?我想知道,因为我正在写一系列小程序来教我的朋友关于tkinter,然后向他介绍画布。如果我的tkinter样本的窗口大小都相同,那将是很好的。我也想知道(好奇)。非常感谢你。
我在MAC OS 10.5.8上使用python 3.2.2。
答案 0 :(得分:10)
pack_propagate
只设置一个标志,它不会导致框架放在窗口小部件中。它不能代替调用pack
。
换句话说,你必须这样做:
# put the frame in its parent
frame.pack()
# tell frame not to let its children control its size
frame.pack_propagate(0)
# put the textbox in the frame
textBox.pack()
答案 1 :(得分:2)
回答第二个问题:是的,有办法。
tkinters Tk
确实具有Tk.geometry
功能。当您不带参数调用它时,您将以'widthxheight+x+y'
的形式获得当前几何图形,例如(在Windows 10上)'200x200+26+26'
(当您创建第一个Tk窗口时)。使用该格式,您可以通过以下方式调整Tk的大小:例如,root.geometry('400x500+60+60')
将宽度设置为400,高度设置为500,并将其放置在坐标(60 | 60)上。
这对Tk
和Toplevel
都适用。但是Toplevel
在初始化或配置时也采用参数height和width。如果您希望它们在装东西时保持其大小,只需在它们上使用root.pack_propagate(False)
。
通过这种方式,网格管理器也有类似的东西:root.grid_propagate(False)