2013-03-02 77 views
1

我有一個名爲_their_grid的Canvas,它有許多與鼠標點擊相關的關聯事件。我在一定的條件下禁用它10秒。以下是相關的代碼。Tkinter畫布狀態的奇怪行爲time.sleep

 print "not your turn" 
     # disable opponent's grid during their turn 
     self._their_grid.config(state=DISABLED) 
     time.sleep(10) 
     self._their_grid.config(state=NORMAL) 
     print "now you can go" 

但是,在十秒鐘的睡眠中,我仍然設法觸發事件。這不應該是這樣,因爲狀態= DISABLED應該關閉所有事件。下面的代碼在睡眠狀態下注釋掉,會停止所有事件。

 print "not your turn" 
     # disable opponent's grid during their turn 
     self._their_grid.config(state=DISABLED) 
     #time.sleep(10) 
     #self._their_grid.config(state=NORMAL) 
     #print "now you can go" 

爲什麼我用time.sleep得到這種奇怪的行爲?

回答

0

time.sleep()不會阻止事件被接受,它只是阻止它們被處理。每當您點擊應用程序休眠時,事件都會簡單地添加到隊列中,並在睡眠完成時進行處理。

你應該差不多從來沒有在GUI中調用睡眠。你應該做的,而不是設置狀態爲禁用,然後安排了十秒鐘後復位狀態:

def re_enable(self): 
    self._their_grid.config(state=NORMAL) 
... 
self.after(10000, self.re_enable) 
+1

然而,當小部件被禁用,你嘗試觸發任何綁定的事件(例如點擊禁用按鈕),當再次啓用小部件時,不處理它。 'time.sleep()'有什麼區別? – 2013-03-03 00:16:54

+0

@ A.Rodas:time.sleep完全按照它的說法:它會讓您的應用程序進入睡眠狀態。操作系統仍然嚮應用程序及其小部件發送事件,但該應用程序無法響應,因爲它很慢。當它醒來時,它處理事件隊列中的任何事物。將狀態設置爲禁用指示事件循環忽略某些事件。 – 2013-03-03 01:16:46

+0

@BryanOakley但是一旦Canvas被禁用,在應用程序進入睡眠狀態之前就不應該有「排隊」事件。所以當它「醒來」時,爲什麼會有排隊的事件呢? – BlackSheep 2013-03-03 04:33:16