2016-11-04 100 views
0

當我按下「開始程序」按鈕時,它會啓動5秒的任務並阻止GUI。 據我所知,我需要使用線程,所以每個按鈕將獨立於GUI工作。 我已經被困了近一個月了,有人可以告訴我如何執行def start_Button(self):函數使用線程嗎?當按下按鈕時,Tkinter GUI卡住直到任務結束

from tkinter import * 
import time 


class Window(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.master = master 
     self.init_window() 

    def init_window(self): 
     self.var = IntVar() 
     self.master.title("GUI") 
     self.pack(fill=BOTH, expand=1) 
     quitButton = Button(self, text="Exit", command=self.client_exit) 
     startButton = Button(self, text="Start Program", command=self.start_Button) 

     quitButton.grid(row=0,column=0) 
     startButton.grid(row=0, column=2) 

    def client_exit(self): 
     exit() 

    def start_Button(self): 
     print('Program is starting') 
     for i in range (5): 
      print(i) 
      time.sleep(1) 


root = Tk() 
root.geometry("200x50") 
app = Window(root) 
root.title("My Program") 
root.mainloop() 

回答

2

有很多重要的問題要問你跳進線程在第一次使用前,但總的來說,最重要的問題是「我怎麼想我的線程之間的溝通?」在你最小的例子中,你根本不需要任何通信,但是你的真實代碼start_Button可能會做一些工作並將數據返回給GUI。如果是這樣,你就有更多的工作要做。請澄清,如果是這樣的話,作爲評論。

對於最簡單的例子,它其實很簡單。

class Window(tkinter.Frame): 
    # the rest of your GUI class as written, but change... 

    def start_Button(self): 
     def f(): 
      # this is the actual function to run 
      print('Program is starting') 
      for i in range (5): 
       print(i) 
       time.sleep(1) 
     t = threading.Thread(target=f) 
     t.start() 
+0

我已經嘗試了很長一段時間這樣的解決方案,但無法將線程模塊放置在正確的位置,現在,您告訴我這是有道理的!我知道使用線程是棘手的,並且可能會干擾,但在我的程序中(現在不是這種情況)。謝謝! –

相關問題