gpt4 book ai didi

python - Tkinter pack() 几何管理器困惑

转载 作者:太空宇宙 更新时间:2023-11-04 10:25:33 25 4
gpt4 key购买 nike

就在我以为我理解了 pack() 管理器时,我遇到了以下问题:

我创建了两个框架(每个框架都有一个 Button)并想将它们水平打包到另一个框架(即“主”框架)中。由于某种原因,它们垂直出现。如果我用一个简单的按钮替换第一帧,则按钮 + 第二帧 水平打包,使用相同的 pack() 指令。

这是该程序的提炼(但有效)版本:

from Tkinter import *

class QuitBtn1(Button):
def __init__(self):
Button.__init__(self)
self["text"] = "Quit"
self["fg"] = "red"
self["command"] = self.quit

class QuitBtn(Frame):
def __init__(self):
Frame.__init__(self)

b = Button(text = "Quit", fg = "red", command = self.quit)
b.pack()

class HiBtn(Frame):
def __init__(self):
Frame.__init__(self)

b = Button(text = "Hi there", fg = "blue", command = self.quit)
b.pack()

class App(Frame):
def __init__(self, master = None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()

def say_hi(self):
print "hi there, everyone!"

def createWidgets(self):
self.QUIT = QuitBtn().pack(side = LEFT)
self.hi_there = HiBtn().pack(side = LEFT)


root = Tk()
app = App(master = root)
app.mainloop()
root.destroy()

运行时,它会生成两个垂直打包的帧。只需切换 QuitBtn1QuitBtn 的名称(将框架更改为一个简单的按钮),即可将包装更改为水平。

我看过数十个示例,它们似乎以某种方式避免了这种确切的结构。我在这里做错了什么吗?

最佳答案

问题是您没有为任何小部件提供父窗口,因此它们都默认为根窗口。即使您认为按钮在框架内,但它们不是。

因为 pack 的默认设置是将东西放在顶部,所以当您在按钮上调用 pack() 时,它们会堆叠在根窗口中。您的两个框架,因为其中没有任何内容,所以大小为 1x1,因此您看不到它们。 被打包在左侧,您只是看不到它们。

解决方案是正确嵌套您的小部件。例如:

class QuitBtn(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)

b = Button(self, text = "Quit", fg = "red", command = self.quit)
b.pack()

def createWidgets(self):
self.QUIT = QuitBtn(self)
...
self.QUIT.pack(side = LEFT)
...

上面的代码在 QuitBtn 框架内创建了一个按钮小部件,并将其打包到该框架的顶部。稍后,该框架(及其内容)将被打包到主框架的左侧。

将小部件的创建与小部件的布局分开也很重要。当您执行类似 self.QUIT = QuitBtn(...).pack(...) 的操作时,self.QUIT 将被设置为 None 因为那是 pack(...) 返回的内容。另外,根据我的经验,将给定包含框架的所有布局移动到单独的 block 中可以更轻松地管理布局。

关于python - Tkinter pack() 几何管理器困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29474570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com