0
我正在使用python 3和tkinter。我有一個簡單的GUI來觸發後端進程(在不同的類中,在GUI類中實例化)。我希望在後端進程完成後向用戶顯示一條消息,即使用messagebox(或其他任何東西並不重要),但只能在該進程完成後才顯示。 我該怎麼做?Python3,Tkinter - 處理完成後顯示消息
在此先感謝
我正在使用python 3和tkinter。我有一個簡單的GUI來觸發後端進程(在不同的類中,在GUI類中實例化)。我希望在後端進程完成後向用戶顯示一條消息,即使用messagebox(或其他任何東西並不重要),但只能在該進程完成後才顯示。 我該怎麼做?Python3,Tkinter - 處理完成後顯示消息
在此先感謝
如果過程塊的主循環在執行它,你可以創建你的主類中的方法在運行過程中,並顯示在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。
這個問題似乎比較模糊。 「如何在流程完成後顯示消息」的簡單答案是「等待流程完成並顯示消息」。你有什麼問題?等待,還是顯示?你有沒有嘗試過使用messagebox? –
嗨@BryanOakley,我想弄清楚如何觸發消息顯示和tKinter類應放置在消息箱,以便它只在觸發後纔打開。 –
是否在不同的線程中執行後端進程?我們需要更多關於您的問題的信息來回答您的問題。 –