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()
- 不要使用
place
。学习使用 pack
或 grid
。 place
管理的小部件不会影响其父级的大小。因为你没有给 my_frame
一个尺寸,也因为你没有打包它来填充 window,所以它只有 1 像素高 x 1 像素宽。这使得它(以及其中的小部件)有效地不可见。如果您坚持使用 place
,您需要给 my_frame
一个大小,或者用使其填充其父级的选项打包它。
my_frame.pack
应该是 my_frame.pack()
(注意后面的括号)
如果您对快速修复而不是解释更感兴趣,请像这样打包 my_frame
:
my_frame.pack(fill="both", expand=True)
这就是修复代码所需的全部内容。
问题似乎是您在框架上使用 pack
,在小部件上使用 place
。你不应该混合使用 Tkinter 布局管理器;使用 pack
、 或 grid
、 或 place
.
如果您使用 place
作为您的小部件,那么 frame.pack
不知道要制作多大的框架。您必须手动提供框架的大小以适合其所有小部件,方法是在构造函数中使用 width
和 height
参数,或者使用 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
,而是改用 grid
或 pack
。这样,框架的大小将自动适应其所有内容。
为了使您的代码正常工作,我可以做的最小更改如下:
如果你要使用框架,你需要给它一个像这样的尺寸:
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()
我一直在通过电子书学习 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()
- 不要使用
place
。学习使用pack
或grid
。place
管理的小部件不会影响其父级的大小。因为你没有给my_frame
一个尺寸,也因为你没有打包它来填充 window,所以它只有 1 像素高 x 1 像素宽。这使得它(以及其中的小部件)有效地不可见。如果您坚持使用place
,您需要给my_frame
一个大小,或者用使其填充其父级的选项打包它。 my_frame.pack
应该是my_frame.pack()
(注意后面的括号)
如果您对快速修复而不是解释更感兴趣,请像这样打包 my_frame
:
my_frame.pack(fill="both", expand=True)
这就是修复代码所需的全部内容。
问题似乎是您在框架上使用 pack
,在小部件上使用 place
。你不应该混合使用 Tkinter 布局管理器;使用 pack
、 或 grid
、 或 place
.
如果您使用 place
作为您的小部件,那么 frame.pack
不知道要制作多大的框架。您必须手动提供框架的大小以适合其所有小部件,方法是在构造函数中使用 width
和 height
参数,或者使用 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
,而是改用 grid
或 pack
。这样,框架的大小将自动适应其所有内容。
为了使您的代码正常工作,我可以做的最小更改如下:
如果你要使用框架,你需要给它一个像这样的尺寸:
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()