我正在使用python 3和tkinter。我有一个简单的GUI来触发后端进程(在不同的类中,在GUI类中实例化)。我希望在后端进程完成后向用户显示一条消息,即使用messagebox(或其他任何内容,并不重要),但仅在该过程完成后才会显示。 我怎么能这样做?
提前致谢
答案 0 :(得分:1)
如果进程在执行时阻塞主循环,您只需在主类中创建一个运行该进程并显示消息框的方法:
import tkinter as tk
from tkinter import messagebox
import time
class BackendProcess:
def __init__(self):
self.finished = False
def run(self):
time.sleep(10)
self.finished = True
class GUI(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.process = BackendProcess()
tk.Button(self, text='Run', command=self.run).pack()
def run(self):
self.process.run()
messagebox.showinfo('Info', 'Process completed!')
if __name__ == '__main__':
gui = GUI()
gui.mainloop()
如果进程没有阻塞主循环,则上述方法不起作用,并且在进程开始后立即显示消息框。为避免这种情况,after
方法可用于定期检查流程的finished
标志:
import tkinter as tk
from tkinter import messagebox
import time
import threading
class BackendProcess:
def __init__(self):
self.finished = False
def task(self):
time.sleep(2)
print('finished')
self.finished = True
def run(self):
thread = threading.Thread(target=self.task, daemon=True)
thread.start()
class GUI(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.process = BackendProcess()
tk.Button(self, text='Run', command=self.run).pack()
def run(self):
self.process.run()
self.check_process()
def check_process(self):
""" Check every 1000 ms whether the process is finished """
if self.process.finished:
messagebox.showinfo('Info', 'Process completed')
else:
self.after(1000, self.check_process)
if __name__ == '__main__':
gui = GUI()
gui.mainloop()
从评论中,我认为第一种方法应该有效,因为该过程是在主线程中执行的。我已经展示了第二种情况,因为完成通知对于经常在单独的线程中执行的耗时任务特别有用,以避免冻结GUI。