python - 如何在 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 打包。有什么办法可以用网格包装做我想做的事吗?
解决方案
以下行导致错误:
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(),因为我认为用它放置对象更容易。你可以在这里阅读
推荐阅读
- c - gcc -c 参数问题并设置输出文件
- php - 根据主题显示图像深色/浅色(例如 Outlook.com)
- java - 如何告诉 Java JAR 文件中的正确文件路径?
- google-sheets - 将值添加到查询结果中的一列
- python - 是否可以以打字稿样式运行异步 python 脚本
- vuetify.js - Vuetify v-data-table v-if 问题
- c++ - C++ 放置删除如何在内部工作(C++ 运行时)?如何克服它的局限?
- php - WooCommerce 中为 foreach() 提供的参数无效
- winapi - 检测窗口是否正在使用硬件加速的图形上下文
- html - 如何在 flexbox 中居中内容