0

我正在尝试为正在处理的应用程序在框架上放置一个按钮......但是当我使用网格时框架消失了

from Tkinter import *
root=Tk()
width = root.winfo_screenwidth()
height = root.winfo_screenheight()
root.geometry(str(width)+'x'+str(height))
frame=Frame(root,width=500, height=500, bg='black')
but1=Button(frame,text='qwe')
but1.grid()
frame.grid()
root.mainloop()

如果我使用place,更糟糕的是,它们都消失了......我看不到FrameButton

from Tkinter import *
root=Tk()
width = root.winfo_screenwidth()
height = root.winfo_screenheight()
root.geometry(str(width)+'x'+str(height))
frame=Frame(root,width=500, height=500, bg='black')
but1=Button(frame,text='qwe')
but1.place()
frame.place()
root.mainloop()

但是当我使用 pack_propagate(0) 时,我可以同时看到它们...

from Tkinter import *
root=Tk()
width = root.winfo_screenwidth()
height = root.winfo_screenheight()
root.geometry(str(width)+'x'+str(height))
frame=Frame(root,width=500, height=500, bg='black')
but1=Button(frame,text='qwe')
but1.pack()
frame.pack_propagate(0)
frame.pack()
root.mainloop()

我的问题是,

  1. pack_propagate(0) 是什么意思?
  2. 为什么框架在有和没有 pack_propagate(0) 的情况下表现得很奇怪?
  3. GRIDPLACE的 pack_propagate(0)等价物是什么?
4

1 回答 1

2

pack_propagate(0) 是什么意思?

pack_propagate(0)告诉 tkinter 让父级控制自己的大小,而不是在使用 pack 管理子级时让其大小由小部件的子级确定。

为什么框架在有和没有 pack_propagate(0) 的情况下表现得很奇怪

我没有看到任何奇怪的行为。您必须更准确地了解“奇怪”的含义。它的行为与记录的一样。place不会导致子级确定父级的大小。如果你不给框架一个大小,它的大小将是 1x1(即:单个像素)。而且,如果框架不可见,则框架内的任何小部件也将不可见。

当您使用packorgrid时,框架将尝试缩小以适合其子项。它并没有消失,你只是可以看到它,因为它的孩子在它上面。如果添加一些填充,您将看到框架。

例如,在第一个块中,将您调用grid的位置更改but1为如下代码,您的黑框将出现:

but1.grid(padx=20, pady=20)

这就是为什么place很少是正确选择的原因之一。两者都pack非常grid出色,可以确保所有小部件都根据它们内部的内容大小合适。

GRID 和 PLACE 的 pack_propagate(0) 等价物是什么

因为gridgrid_propagate。没有等效的 forplace因为这是定义的行为place——它永远不会影响包含小部件的大小。

在绝大多数情况下,您不应使用pack_propagate(0)grid_propagate(0)place。当您正确使用时gridpack您的 gui 将在您运行它的每个平台上保持正确的大小,无论分辨率如何,无论用户加载了什么字体。

于 2018-02-28T01:33:34.353 回答