2014-10-20 134 views
0

我需要一個應用程序,基本上運行一個進度欄幾秒鐘,然後關閉自己。我使用this as an example,同時首先適用於Python 3.4,然後用於我自己的應用程序。但是,由於我構建代碼的方式,它將首先運行線程,它的任務是完成,然後才顯示程序。這對我來說是非常有問題的,而且在使用類時我沒有看到它。Tkinter凍結與多線程

from tkinter import ttk as ttk 
from tkinter import * 
import threading 
import time 



class App: 
    def afterLoading(self): 
     print('Loading finished') 

    def process(self,master): 
     time.sleep(2) 
     print('Thread Done') 
     self.afterLoading() 

    def __init__(self, master): 
     print() 
     master.geometry("1270x800") 
     master.resizable(0,0) 


     t1 = threading.Thread(target=self.process, args=(master,)) 
     t1.start() 
     self.loadingFrame(master) 
     t1.join() 

    def loadingFrame(self, master): 

     frame = Frame(master, width=500, height=300) 
     frame.pack(side=BOTTOM, pady=50) 

     self.bar = ttk.Progressbar(frame, orient='horizontal', mode = 'indeterminate') 
     self.bar.pack(fill=BOTH) 
     self.bar.start(50) 
     self.loadingLabel = Label(frame, text="Please wait whilst the programme initializes.") 
     self.loadingLabel.pack() 





root = Tk() 
b = App(root) 
root.mainloop() 

回答

2

好吧,你的示例代碼,你可以刪除調用t1.join()得到你想要的行爲。這樣,在啓動後臺線程後,您將能夠立即啓動Tk事件循環,這意味着您的GUI實際上可以在線程在後臺運行時啓動。使用t1.join()調用會阻止root.mainloop()執行,直到線程完成,這意味着在線程完成之前您的GUI也不會顯示。