tkinter的.pack_propagate()方法

时间:2012-04-03 15:33:31

标签: python tkinter label

我正在尝试使用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。

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)上。

这对TkToplevel都适用。但是Toplevel在初始化或配置时也采用参数height和width。如果您希望它们在装东西时保持其大小,只需在它们上使用root.pack_propagate(False)

通过这种方式,网格管理器也有类似的东西:root.grid_propagate(False)