2017-06-19 37 views
0

我正在使用python 3和tkinter。我有一個簡單的GUI來觸發後端進程(在不同的類中,在GUI類中實例化)。我希望在後端進程完成後向用戶顯示一條消息,即使用messagebox(或其他任何東西並不重要),但只能在該進程完成後才顯示。 我該怎麼做?Python3,Tkinter - 處理完成後顯示消息

在此先感謝

+1

這個問題似乎比較模糊。 「如何在流程完成後顯示消息」的簡單答案是「等待流程完成並顯示消息」。你有什麼問題?等待,還是顯示?你有沒有嘗試過使用messagebox? –

+0

嗨@BryanOakley,我想弄清楚如何觸發消息顯示和tKinter類應放置在消息箱,以便它只在觸發後纔打開。 –

+0

是否在不同的線程中執行後端進程?我們需要更多關於您的問題的信息來回答您的問題。 –

回答

0

如果過程塊的主循環在執行它,你可以創建你的主類中的方法在運行過程中,並顯示在MessageBox:

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。