将窗口小部件的引用传递给一个函数
问题描述:
在下面的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
,我可以看到的函数完成后,并插入的延迟之后一气呵成(即顺序分配)的所有值。
请按照执行的指令逐个更新文本条目。
答
您应该使用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
称为“递归”。现在它永远有效,但你可以添加一些计数器等来检查递归调用何时应该停止。希望这可以帮助。
这不是我想要的。以上只是一个虚拟代码。我的应用程序实际上想要读取函数内的循环变量的值并更新其文本小部件。所有这些都应该发生在单个函数调用中的不同循环迭代中。所以,根据我的代码: 'def loadStatus(self,stat): stat.insert(END,5) time.sleep(1) stat.insert(END,“hi”) time.sleep(1 ) stat.insert(END,0)' 我希望看到这些值在按下按钮时发生变化并稳定在0。在您的更改中,按一下按钮将会一次又一次地调用func,这是不需要的。 –