我有一個程序,我一直在寫這個程序,開始作爲一個幫助函數,以便我根據該報告中的某些信息在共享驅動器上查找某個報告。我決定給它一個GUI,以便我可以將它分發給其他員工,並在我第一次嘗試實施tkinter
和threading
時遇到了幾個錯誤。摧毀一個線程中的Toplevel鎖定根
我知道老諺語「我有一個問題,然後我使用線程,現在我有兩個問題。」線程沒有,至少,解決第一個問題 - 在現在這樣第二....
我沖淡代碼:
class GetReport(threading.Thread):
def __init__(self,root):
threading.Thread.__init__(self)
# this is just a hack to get the StringVar in the new thread, HELP!
self.date = root.getvar('date')
self.store = root.getvar('store')
self.report = root.getvar('report')
# this is just a hack to get the StringVar in the new thread, HELP!
self.top = Toplevel(root)
ttk.Label(self.top,text="Fooing the Bars into Bazes").pack()
self.top.withdraw()
def run(self):
self.top.deiconify()
# a function call that takes a long time
self.top.destroy() #this crashes the program
def main():
root = Tk()
date,store,report = StringVar(),StringVar(),StringVar()
#####
## labels and Entries go here that define and modify those StringVar
#####
def launchThread(rpt):
report.set(rpt)
# this is just a hack to get the StringVar in the new thread, HELP!
root.setvar('date',date.get())
root.setvar('store',store.get())
root.setvar('report',report.get())
# this is just a hack to get the StringVar in the new thread, HELP!
reportgetter = GetReport(root)
reportgetter.start()
ttk.Button(root,text="Lottery Summary",
command=lambda: launchThread('L')).grid(row=1,column=3)
root.mainloop()
我的預期輸出是root
打開和填充與標籤,條目和按鈕(其中一些隱藏在此示例中)。每個按鈕都會從條目中提取數據並將它們發送到launchThread
函數,該函數將創建一個新線程來執行所需的foos和條形圖以獲取我需要的文書。
該線程將啓動Toplevel,基本上只是通知用戶它正在處理它。當它完成後,頂層將關閉,我所要求的文書工作將打開(我使用ShellExecute
打開一個.pdf),而線程退出(因爲它退出其run
功能)
所發生的情況是,螺紋將啓動它的Toplevel,文檔將打開,那麼Python將變得不響應,需要「結束處理」。
這不是一個好的解決方案。你正在事件循環內部添加一個無限循環,這幾乎總是可以避免的。相反,你可以設置一個動畫循環來運行每秒鐘左右,以檢查線程是否存在。 –
@BryanOakley你可以添加一個答案,證明我可以接受它嗎?這是我在經過不少研究和試驗和錯誤後提出的解決方案。 –