我希望代码能够在后台运行并定期更新我的GUI。我怎么能做到这一点?
例如,假设我想在GUI代码的背景中执行类似的操作,您可以在下面看到:
x = 0
while True:
print(x)
x = x + 1
time.sleep(1)
这是GUI代码:
class GUIFramework(Frame):
def __init__(self,master=None):
Frame.__init__(self,master)
self.master.title("Volume Monitor")
self.grid(padx=10, pady=10,sticky=N+S+E+W)
self.CreateWidgets()
def CreateWidgets(self):
textOne = Entry(self, width=2)
textOne.grid(row=1, column=0)
listbox = Listbox(self,relief=SUNKEN)
listbox.grid(row=5,rowspan=2,column=0,columnspan=4,sticky=N+W+S+E,pady=5)
listbox.insert(END,"This is an alert message.")
if __name__ == "__main__":
guiFrame = GUIFramework()
guiFrame.mainloop()
答案 0 :(得分:6)
有点不清楚你的顶部代码应该做什么,但是,如果你只想每秒调用一个函数(或你想要的每一秒),你可以使用{{3}方法。
所以,如果你只想对textOne
做一些事情,你可能会做类似的事情:
...
textOne = Entry(self, width=2)
textOne.x = 0
def increment_textOne():
textOne.x += 1
# register "increment_textOne" to be called every 1 sec
self.after(1000, increment_textOne)
你可以让这个函数成为你的类的一个方法(在本例中我称之为callback
),你的代码看起来像这样:
class Foo(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.x = 0
self.id = self.after(1000, self.callback)
def callback(self):
self.x += 1
print(self.x)
#You can cancel the call by doing "self.after_cancel(self.id)"
self.id = self.after(1000, self.callback)
gui = Foo()
gui.mainloop()
答案 1 :(得分:2)
如果你真的想要运行一个独特的无限循环,你别无选择,只能使用一个单独的线程,并通过线程安全队列进行通信。但是,除非在相当不寻常的情况下,您永远不需要运行无限循环。毕竟,你已经有一个无限循环运行:事件循环。所以,当你说你想要一个无限循环时,你真的会问如何在无限循环中进行无限循环。
@mgilson给出了一个很好的例子,说明如何使用after
,在尝试使用线程之前应该考虑尝试。线程可以实现您想要的功能,但它也会使您的代码变得更加复杂。