【问题标题】:Tkinter "place" geometry manager not workingTkinter“地方”几何管理器不工作
【发布时间】:2015-03-17 15:02:55
【问题描述】:

我一直在通过电子书学习 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() 后,我得到了这个:

【问题讨论】:

  • “它不能正常工作”?它应该如何运作,以及它如何运作?
  • 请阅读代码并查看我得到的结果(我添加了一张图片)
  • 在问题中包含所有相关信息是您的工作。请修改它。考虑阅读例如stackoverflow.com/help/mcve
  • 只是忘记了 () 对!是的,它来自书中,而不是复制粘贴

标签: python tkinter tkinter-layout


【解决方案1】:
  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)

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

【讨论】:

  • 非常感谢您的回答!
  • 一个很好的解释。非常感谢@BryanOakley
【解决方案2】:

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

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

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

【讨论】:

  • 这行得通!经过测试,它不需要 Frame() 内的“窗口”,仅适用于宽度和高度
  • 小伙伴们至少有3个正确答案!但是,我会选择这一个,因为它解释了一切(不仅仅是告诉我该做什么。我真的不知道如何填充窗口等)并且它更接近我需要的东西!谢谢大家!
【解决方案3】:

你忘了调用 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()

【讨论】:

  • 非常感谢您的回答!
【解决方案4】:

问题似乎是您在框架上使用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。这样,框架的大小将自动适应其所有内容。

【讨论】:

  • 您的观察不正确 - 框架上的包将框架置于根窗口中。按钮上的位置是将按钮放在框架中。这是完全可以接受的。虽然确实不应该在同一个包含小部件中混合网格和打包,但这不是这里发生的事情。另外,place 是一种特殊情况,可以在很多情况下与其他情况一起使用。
  • @BryanOakley 感谢您的提醒。我更新了我的答案,希望现在的解释是正确的。
【解决方案5】:

您的按钮被放置在框架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()

【讨论】:

  • 您的建议很好——使用 pack 而不是 place——但推理存在缺陷。 place 绝对会让小部件出现,但前提是它们位于同样可见的小部件中。在这个问题的情况下,包含窗口只有 1x1,因此“放置”的小部件也将是不可见的。
  • 行不通!按钮现在显示,但位置不正确!
  • 我明白了。我正在编辑它以使按钮显示在正确的位置,谢谢!
猜你喜欢
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
相关资源
最近更新 更多