Tkinter "place" 几何管理器不工作

Tkinter "place" geometry manager not working

我一直在通过电子书学习 Python。现在我正在学习 Tkinter 模块

本书建议运行以下代码。但是,它不能正常工作。有什么想法吗?

from Tkinter import *

window = Tk()
window.geometry("200x200")

my_frame = Frame()
my_frame.pack

button1 = Button(my_frame, text = "I am at (100x150)")
button1.place(x=100, y=150)

button2 = Button(my_frame, text = "I am at (0 x 0)")
button2.place(x=0, y=0, width=100, height=50)

window.mainloop()

我应该得到什么:

我得到的:

添加 button1.pack()button2.pack() 后,我得到:

您的按钮放置在框架 my_frame 内,但由于 my_frame.pack 后缺少括号,框架本身并未出现在屏幕上。此外,框架本身的大小应在括号中指明,并且大到足以包含按钮

此外,您不能对一个小部件使用 place 而对另一个小部件使用 pack,放置系统必须在整个代码中保持一致。 这是编辑后的代码:

from Tkinter import *

window = Tk()
window.geometry("200x200")

my_frame = Frame(window)
my_frame.place(x=0, y=0, width=200, height=200)

button1 = Button(my_frame, text = "I am at (100x150)")
button1.place(x=100, y=150, width=100, height=50)

button2 = Button(my_frame, text = "I am at (0 x 0)")
button2.place(x=0, y=0, width=100, height=50)

window.mainloop()
  1. 不要使用 place。学习使用 packgridplace 管理的小部件不会影响其父级的大小。因为你没有给 my_frame 一个尺寸,也因为你没有打包它来填充 window,所以它只有 1 像素高 x 1 像素宽。这使得它(以及其中的小部件)有效地不可见。如果您坚持使用 place,您需要给 my_frame 一个大小,或者用使其填充其父级的选项打包它。
  2. my_frame.pack 应该是 my_frame.pack()(注意后面的括号)

如果您对快速修复而不是解释更感兴趣,请像这样打包 my_frame

my_frame.pack(fill="both", expand=True)

这就是修复代码所需的全部内容。

问题似乎是您在框架上使用 pack,在小部件上使用 place。你不应该混合使用 Tkinter 布局管理器;使用 pack grid place.

如果您使用 place 作为您的小部件,那么 frame.pack 不知道要制作多大的框架。您必须手动提供框架的大小以适合其所有小部件,方法是在构造函数中使用 widthheight 参数,或者使用 frame.place,例如

root = Tk()
root.geometry("300x300")

frame = Frame(root)
frame.place(width=200, height=200)

button1 = Button(frame, text = "I am at (100x150)")
button1.place(x=100, y=150)

button2 = Button(frame, text = "I am at (0 x 0)")
button2.place(x=0, y=0, width=100, height=50)

root.mainloop()

但正如其他人已经指出的那样,我根本不会使用 place,而是改用 gridpack。这样,框架的大小将自动适应其所有内容。

为了使您的代码正常工作,我可以做的最小更改如下:

如果你要使用框架,你需要给它一个像这样的尺寸:

from Tkinter import *

window = Tk()
window.geometry("300x300")

# Note the change to this line
my_frame = Frame(window, width=300, height=300) 
my_frame.pack() # Note the parentheses added here

button1 = Button(my_frame, text="I am at (100x150)")
button1.place(x=100, y=150)

button2 = Button(my_frame, text="I am at (0 x 0)")
button2.place(x=0, y=0, width=100, height=50)

window.mainloop()

此外,pack()必须是函数调用,所以加括号

您忘记调用 myframe.pack 函数 - 您只是将函数 名字在那里,这是有效的声明,但框架没有进入 "packed" window(我还加了fill和expand,让frame填满整个window,不然放不下)。 这应该有效:

from Tkinter import *

window = Tk()
window.geometry("200x200")

my_frame = Frame(window)
my_frame.pack(fill=BOTH, expand=True)

button1 = Button(my_frame, text = "I am at (100x150)")
button1.place(x=100, y=150)

button2 = Button(my_frame, text = "I am at (0 x 0)")
button2.place(x=0, y=0, width=100, height=50)

window.mainloop()