在下面的Python应用程序中,我的基于Tkinter
的主GUI窗口有一些按钮(进而调用某些函数)和文本小部件。要通过按下按钮调用的函数更新文本小部件。
我尝试将文本发送到功能但我无法按顺序查看文本中的更新值。相反,它首先完成功能(或循环),然后在最后它将所有值一起更新。我希望逐个看到它们,因为执行了相应的指令。
from Tkinter import *
import Tkinter as tk
from functools import partial
import time
class mainWindow:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.stat0 = tk.Text(self.frame,bg='cyan', font=("Helvetica", 10), width = 8, height = 1)
self.stat0.grid(row=2, column=0, sticky=W)
self.b0 = tk.Button(self.frame,bg='black',fg='white',text='LOAD',font=("Helvetica", 8),command=lambda:self.loadStatus(self.stat0))
self.b0.grid(row = 1, column = 0, sticky=W)
self.frame.grid()
def loadStatus(self,stat):
stat.insert(END,5)
time.sleep(1)
# stat.delete(1.0,END)
stat.insert(END,"hi")
# stat.delete(1.0,END)
time.sleep(1)
stat.insert(END,0)
if __name__ == '__main__':
#main()
root = tk.Tk()
app = mainWindow(root)
root.mainloop()
在这里,按下load
按钮,我可以在功能完成后和插入延迟后一次看到所有值(按顺序分配)。
请按照执行的说明逐一更新文本条目。
答案 0 :(得分:1)
您应该使用after在tkinter中执行一些时间触发的事件。我更改了您的代码以使用它:
from Tkinter import *
import Tkinter as tk
from functools import partial
class mainWindow:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.stat0 = tk.Text(self.frame,bg='cyan',
font=("Helvetica", 10), width = 8, height = 1)
self.stat0.grid(row=2, column=0, sticky=W)
self.b0 = tk.Button(self.frame,bg='black',fg='white',text='LOAD',
font=("Helvetica", 8),command=self.loadStatus)
self.b0.grid(row = 1, column = 0, sticky=W)
self.frame.grid()
def loadStatus(self):
self.stat0.insert(END, "hi")
self.frame.after(1000, self.loadStatus)
if __name__ == '__main__':
#main()
root = tk.Tk()
app = mainWindow(root)
root.mainloop()
这个想法是loadStatus
被after
“递归地”称为{{1}}。现在它永远工作,但你可以添加一些计数器等,以检查递归调用何时应该停止。希望这会有所帮助。