2

I've been learning Python from an e-book. Right now I am learning about the Tkinter module

The book suggested running the following code. However, it does not work as it should. Any ideas why?

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()

What I should get:

The ideal result

What I get:

The actual result

After adding button1.pack() and button2.pack(), I get this:

The result with a different geometry manager

4

5 回答 5

8
  1. 不要使用place. 学习使用packgrid。管理的小部件place不会影响其包含父级的大小。因为你没有给出my_frame尺寸,也因为你没有把它打包成填满窗口,所以它只有 1 像素高 x 1 像素宽。这使得它(以及其中的小部件)实际上是不可见的。如果您坚持使用place,您需要给出my_frame一个大小,或者将其与使其填充其父级的选项一起打包。
  2. my_frame.pack应该是my_frame.pack()(注意尾括号)

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

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

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

于 2015-03-17T15:17:45.240 回答
4

为了使您的代码正常工作,我可以做出的最小更改是这样的:

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

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()必须是函数调用,所以添加括号

于 2015-03-17T15:25:53.193 回答
1

您忘记调用该myframe.pack函数 - 您只是将函数名称放在那里,这是有效的声明,但框架没有“打包”到 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()
于 2015-03-17T15:34:27.170 回答
0

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

如果您place用于您的小部件,那么frame.pack不知道要制作多大的框架。您必须手动提供框架的大小以适合其所有小部件,方法是使用构造函数中的widthandheight参数,或者使用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,而是改用gridor pack。这样,框架的大小将自动适应其所有内容。

于 2015-03-17T15:25:44.447 回答
-1

您的按钮被放置在 Frame 内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()
于 2015-03-17T15:15:30.397 回答