pack_propagate(0)相当于Grid和place

时间:2018-02-28 00:46:38

标签: python python-3.x python-2.7 tkinter tkinter-layout

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

时,框架会消失
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()

如果我使用地方,更糟糕的是,它们都会消失......我看不到框架按钮

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. GRID PLACE 的pack_propagate(0)的等效是什么?

1 个答案:

答案 0 :(得分:1)

  

pack_propagate(0)是什么意思?

pack_propagate(0)告诉tkinter让父控制它自己的大小,而不是让它的大小由小部件的子节点决定,当使用pack管理子节目时

  

为什么使用和不使用pack_propagate(0)

时帧的行为都很奇怪

我没有看到任何奇怪的行为。你必须更准确地说出“怪异”的意思。它的行为与记录一致。 place不会导致孩子确定父母的大小。如果你不给框架一个尺寸,它的尺寸将是1x1(即:一个像素)。并且,如果框架不可见,框架内的任何小部件也将是不可见的。

当您使用packgrid时,框架会尝试缩小以适合其子项。它不会消失,你只能看到它,因为它的孩子在它上面。如果你添加一些填充,你会看到框架。

例如,在第一个区块中,将gridbut1的{​​{1}}更改为以下代码,并显示黑框:

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

这是place很少是正确选择的原因之一。 packgrid都可以很好地确保所有小部件的大小都基于其中的内容。

  

GRID和PLACE

的pack_propagate(0)的等价物

对于grid,它是grid_propagateplace没有等价物,因为这是place的定义行为 - 它永远不会影响包含小部件的大小。

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