首页 > 解决方案 > 如何在 Python tkinter 中使用网格几何图形更新标签?

问题描述

我创建的 GUI 有问题,其中包含一个标签,表明程序正在后台运行,真正的脚本处理大量数据,所以我希望该指示器告诉用户它确实在做某事。到目前为止它工作得很好,在脚本启动时显示“空闲”,在函数运行时显示“运行”,完成时显示“完成”。(代码只是相关部分):

from tkinter import*

def make_pause_function(sleepytime):
    import time
    print("Falling asleep")
    time.sleep(sleepytime)
    print("Awakening")

class MyGUI:

   def __init__(self):
    self.__mainWindow = Tk()
    self.header = StringVar()
    self.header.set(3)
    self.labelText = 'Idle'
#    self.Button2 = Button(text = "Sleep for X seconds!", command = self.run_main_script).grid(row=1,column=0)
#    self.Entry2 = Entry(self.__mainWindow, textvariable=self.header, width = 100).grid(row=2,column=0)
#    self.Label3 = Label(self.__mainWindow, text = self.labelText).grid(row=3,column=0)

    self.Button2 = Button(text = "Sleep for X seconds!", command = self.run_main_script)
    self.Entry2 = Entry(self.__mainWindow, textvariable=self.header, width = 100)
    self.Label3 = Label(self.__mainWindow, text = self.labelText)

    self.Button2.pack()
    self.Entry2.pack()
    self.Label3.pack()

    mainloop()

   def run_main_script(self):
    self.Label3["text"] = 'running'
    self.__mainWindow.update_idletasks()
    header=self.header.get()
    make_pause_function(int(header))
    self.Label3["text"] = 'done'
    self.__mainWindow.update_idletasks()

myGUI = MyGUI()

但是当 GUI 由于许多选项而增长时,我从包切换到网格几何管理器,然后经过大量试验和错误后我开始工作的标签更新再次被破坏。以下代码不起作用:

from tkinter import*

def make_pause_function(sleepytime):
    import time
    print("Falling asleep")
    time.sleep(sleepytime)
    print("Awakening")

class MyGUI:

   def __init__(self):
    self.__mainWindow = Tk()
    self.header = StringVar()
    self.header.set(3)
    self.labelText = 'Idle'
    self.Button2 = Button(text = "Sleep for X seconds!", command = self.run_main_script).grid(row=1,column=0)
    self.Entry2 = Entry(self.__mainWindow, textvariable=self.header, width = 100).grid(row=2,column=0)
    self.Label3 = Label(self.__mainWindow, text = self.labelText).grid(row=3,column=0)

#    self.Button2 = Button(text = "Sleep for X seconds!", command = self.run_main_script)
#    self.Entry2 = Entry(self.__mainWindow, textvariable=self.header, width = 100)
#    self.Label3 = Label(self.__mainWindow, text = self.labelText)

#    self.Button2.pack()
#    self.Entry2.pack()
#    self.Label3.pack()

    mainloop()

   def run_main_script(self):
    self.Label3["text"] = 'running'
    self.__mainWindow.update_idletasks()
    header=self.header.get()
    make_pause_function(int(header))
    self.Label3["text"] = 'done'
    self.__mainWindow.update_idletasks()

myGUI = MyGUI()

似乎 update_idletasks 不喜欢网格。但我不喜欢为带有大量按钮和字段的 GUI 打包。有什么办法可以用网格包装做我想做的事吗?

标签: pythontkinterlabel

解决方案


以下行导致错误:

self.Label3 = Label(self.__mainWindow, text = self.labelText).grid(row=3,column=0)

grid() 是一个不返回任何内容(无)的函数。正因为如此,你没有保存self.Lable3任何变量。然后,当您运行该行时,会self.Label3["text"] = 'running'弹出一个错误,因为self.Lable3是 None。为了解决它,将这些行分开 - 首先将 Label 保存在变量中,然后在其上使用 grid() 函数:

self.Label3 = Label(self.__mainWindow, text = self.labelText)
self.Label3.grid(row=3,column=0)

顺便说一句,我建议使用 place() 方法而不是 grid(),因为我认为用它放置对象更容易。你可以在这里阅读


推荐阅读