Python 3.x 状态栏使用.pack不';不要延伸过我的网格框架

Python 3.x 状态栏使用.pack不';不要延伸过我的网格框架,python-3.x,tkinter,Python 3.x,Tkinter,我终于投身于编程,最近才开始思考类/子类/继承等问题 问题 My root.geometry设置为500x500,但我的状态栏没有超出GUI顶部标签的网格框架。结果是在整个窗口的底部有一个小小的状态栏 来自tkinter import*#是的--我知道这会聚集名称空间--我稍后会更改它 更新率=1000 课程申请(框架): 全局起始更新 beginupdate=False 定义初始(自我,主): “”“初始化帧”“” 帧。\uuuu初始化(自,主) self.grid(粘性=NSEW) self

我终于投身于编程,最近才开始思考类/子类/继承等问题

问题 My root.geometry设置为500x500,但我的状态栏没有超出GUI顶部标签的网格框架。结果是在整个窗口的底部有一个小小的状态栏

来自tkinter import*#是的--我知道这会聚集名称空间--我稍后会更改它
更新率=1000
课程申请(框架):
全局起始更新
beginupdate=False
定义初始(自我,主):
“”“初始化帧”“”
帧。\uuuu初始化(自,主)
self.grid(粘性=NSEW)
self.create_widgets()
self.updater()
def创建_小部件(自):
#**********状态栏**********
self.status\u frame=帧(self)
self.healthstatus=StringVar()
self.status=Label(self.status\u frame,textvariable=self.healthstatus,bd=1,relief=sinken,anchor=W)
self.status\u frame.pack(side=BOTTOM,fill='both',expand=TRUE)
self.status.pack(side=BOTTOM,fill='both',expand=TRUE)
def更新内容1(自我):
如果开始更新:
donothing()
打印('已更新')
def更新程序(自我):
全局起始更新
self.update_something1()
beginupdate=True
self.after(更新率,self.updater)
def donothing():
打印(“好的,好的,我不会”)
root=Tk()
root.configure(background='black')
根几何(“500x500”)
app=应用程序(根)
root.mainloop()

我花了将近4个小时试图弄清楚这个愚蠢的状态栏。有人有什么建议吗?

问题的根源在于,您创建的小部件中没有任何内容,因此它们的自然大小只有几个像素高和宽。即使您强制窗口为500x500,也看不到任何内容,因为它们都非常小

主要原因是您使用的是
grid
,默认情况下
grid
仅使用显示其内容所需的最小空间。因此,在根窗口的左上角(第0行,第0列)位置,带有微小标签的微小帧仅出现在几个像素中

我个人的经验法则是,如果您只将一个小部件放入另一个小部件中,则始终使用
pack
,例如将
app
放入根窗口中。您可以使用
grid
解决此问题,方法是为第0行和第0列赋予权重,但当
pack
只需要一行时,总共需要三行

因此,第一步是从
\uuuu init\uuuu
中删除这行代码:

    self.grid(sticky=NSEW)
我认为一个小部件(在您的例子中是,
应用程序
)将自己放在另一个小部件中是一种不好的做法。相反,创建
应用程序的代码应该负责将其添加到根窗口

为此,请在创建
app
之后和调用
mainloop
之前立即添加以下行:

app.pack(side="top", fill="both", expand=True)
在这一点上,你将什么也看不到,因为没有什么可看的。当然,这并不完全正确——根窗口是黑色的,但您将看到的是白色(或灰色),因为这是状态标签及其所在帧的颜色。另外,您已经请求状态标签完全填充其框架,并且您已经请求该框架填充窗口

您可以通过在标签中添加字符串来看到这一点。例如,在创建
self.healthstatus
后添加此项:

self.healthstatus.set("Hello, World!")
您应该在屏幕的垂直中间看到消息,并与左侧对齐

正如我前面所写的,您已经请求状态标签和框架来填充它的窗口。我怀疑你真的想要那样。将这两个小部件上的pack调用方式更改为:

self.status_frame.pack(side=BOTTOM, fill='x', expand=False)
self.status.pack(side=BOTTOM, fill='x', expand=False)
请注意,这将阻止这些小部件扩展以填充所有空间,而只填充x方向,而保留在窗口底部

这是一个工作版本,尽管我删除了不必要的
更新程序
函数,因为它与布局问题无关:

from tkinter import *

class Application(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.create_widgets()

    def create_widgets(self):
        self.status_frame = Frame(self)
        self.healthstatus = StringVar()
        self.healthstatus.set("Hello, World!")
        self.status = Label(self.status_frame, textvariable=self.healthstatus, bd=1, relief=SUNKEN, anchor=W)

        self.status_frame.pack(side=BOTTOM, fill='x', expand=False)
        self.status.pack(side=BOTTOM, fill='x', expand=False)

root = Tk()
root.configure(background='black')
root.geometry("500x500")

app = Application(root)
app.pack(fill="both", expand=True)

root.mainloop()

如果您将代码减少到一个最小值,If将有所帮助。我看到很多代码似乎与问题无关。例如,我建议删除除空工具栏、主窗口和状态栏之外的几乎所有内容。在添加任何其他小部件之前,先让它们工作。你试图一次解决太多的问题。天啊,对一张第一次的海报来说,投反对票真的很有必要吗。我尽了我所能来减少这个。有什么不相关的吗?这是一个精简的类,它只执行预期的基本功能。如果我删除了这个核心功能,它当然会按预期工作。以前是这样的。当我在类中移动这个状态栏进行初始化时,问题就出现了,类中的代码应该清楚地说明为什么我需要它而不是外部(更新grid()上的标签/按钮和pack()上的状态栏)。一个简单的例子意味着人们可以简单地复制和粘贴您的代码,运行并获取您收到的错误,这也包括导入。啊,我明白了。我为误解表示歉意。我认为这个问题太基本了,有人可能会一头雾水地知道。我明天会尝试编辑一些内容(已经编辑了36个小时)没有任何菜单栏代码是复制问题所必需的。而且,我非常确定主窗口中的任何标签都不是复制问题所必需的。此外,您的代码引用了不存在的
donothing
balance
。而且,您缺少导入。所有这些都意味着没有人可以复制您的问题m、 这降低了问题的质量。如果你需要帮助,你需要尽你所能帮助那些自愿参加t