我正在使用内置的 Python GUI Tkinter 制作程序原型(prototype),当我尝试同时更新多个标签时遇到一些问题。 GUI 可以处理几次刷新,但 10 秒左右后就会卡住。我需要所有标签在非常接近的时间更新,因为每个标签显示不同的传感器数据。
现在,我正在使用random
模块不断生成数字来代替实际数据。将有 10 个左右的标签同时执行此操作,我想确保 tkinter 可以处理它。标签也会每隔几分之一秒(大约 200 毫秒)更新一次。我在 Windows 上使用 python 3.3。
我已经阅读了一些选项,但我对 tkinter 缺乏经验。 链接: Here. And Here.
我应该考虑多线程吗?多重处理?我对这两个都没有经验,但如果这意味着解决这个问题,我愿意学习。
我想要用 tkinter
做的事情是否可行?我应该使用 pygame 还是其他 GUI?我在这里缺少什么?
import random
from tkinter import *
class Application(Frame):
"""The GUI window"""
def __init__(self, master):
"""Setup the Frame"""
super(Application, self).__init__(master)
self.grid()
self.setupWidgets()
self.update()
def setupWidgets(self):
"""Setup widgets for use in GUI"""
#setup data readings
self.data_lbl_txt = "Data Readings"
self.data_lbl = Label(self, text = self.data_lbl_txt)
self.data_lbl.grid(row = 0, column = 1, columnspan = 2, sticky = E)
#setup first data piece
self.data1_txt = "First piece of data:"
self.data1_lbl = Label(self, text = self.data1_txt)
self.data1_lbl.grid(row = 1, column = 1, sticky = W)
self.data1 = StringVar()
self.data1_Var = Label(self, textvariable = self.data1)
self.data1_Var.grid(row = 1, column = 2, sticky = W)
#setup second data piece
self.data2_txt = "Second piece of data:"
self.data2_lbl = Label(self, text = self.data2_txt)
self.data2_lbl.grid(row = 2, column = 1, sticky = W)
self.data2 = StringVar()
self.data2_Var = Label(self, textvariable = self.data2)
self.data2_Var.grid(row = 2, column = 2, sticky = W)
def update(self):
self.data1.set(random.randint(1,10))
self.data1_Var.after(200, self.update)
self.data2.set(random.randint(1,10))
self.data2_Var.after(200, self.update)
root = Tk()
root.title("Data Output")
root.geometry("600x250")
window = Application(root)
window.mainloop()
最佳答案
我相信您在这里无意中创建了一个fork bomb在 update
方法中。
这段代码:
def update(self):
self.data1.set(random.randint(1,10))
self.data1_Var.after(200, self.update)
self.data2.set(random.randint(1,10))
self.data2_Var.after(200, self.update)
意味着每次调用该方法时,都会再次调用两次(或者更确切地说,在未来 200 毫秒内,因为您有 .after(200, self.update)
两次。
这意味着而不是这个:
update is called 1x
200 millisecond gap
update is called 1x
200 millisecond gap
update is called 1x
200 millisecond gap
update is called 1x
200 millisecond gap
update is called 1x
200 millisecond gap...
你有这个:
update is called 1x
200 millisecond gap
update is called 2x
200 millisecond gap
update is called 4x
200 millisecond gap
update is called 8x
200 millisecond gap
update is called 16x
200 millisecond gap...
它会在大约 10 秒(或 10,000 毫秒)后卡住,因为它试图一次调用 2^50(或 1125899906842624)个 update
函数!
我认为(自从我使用 Tkinter 以来已经有一段时间了)解决这个问题的方法是在该函数中执行 root.after
。或者,您可以创建多个不同的 update
函数,每个标签一个,每个函数仅调用 after
一次。
关于python - 同时更新多个标签时 Tkinter 没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18578557/