Python3,Tkinter - 在进程完成后显示消息

时间:2017-06-19 18:24:57

标签: python tkinter

我正在使用python 3和tkinter。我有一个简单的GUI来触发后端进程(在不同的类中,在GUI类中实例化)。我希望在后端进程完成后向用户显示一条消息,即使用messagebox(或其他任何内容,并不重要),但仅在该过程完成后才会显示。 我怎么能这样做?

提前致谢

1 个答案:

答案 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。