2013-03-25 49 views
0

我已經使用tkinter創建了GUI,它將在RaspberryPi上運行並執行各種操作,例如照明LED。我遇到的問題是使用root.after打開和關閉指示燈,如同使用time.sleep()一樣,在此睡眠期間GUI將凍結。這是我的代碼,下面我想用某種延遲大約500ms替換time.sleep()。使用tkinter延遲的Python建議

def toggleLED(root,period=0): 
    if (period <15) and (Status is "On"): 
      GPIO.output(11, True) 
      time.sleep(0.5) #Needs to be replaced as causing GUI to freeze 
      GPIO.output(11, False) 
      root.after(1000, lambda: toggleLED(root, period)) #schedule task every 1 second while condition is true 
    elif (Status == "Off"): 
      print("Lights have been switched off") 
    else: 
      GPIO.output(11, True) 

感謝

這是一個解決方案,但它似乎很凌亂:

問題的
def toggleLED(root,period=0): 
    global Flash 
    while (period <30) and (Status is "On"): 
      if (Flash is True): 
        GPIO.output(11, False) 
        Flash = False 
        break 
      elif (Flash is False): 
        GPIO.output(11, True) 
        Flash = True 
        break 
      else: 
        break 
    if (period <30) and (Status == "On"): 
      period +=1 
      print(period) 
      root.after(500, lambda: toggleLED(root, period)) 
    elif (Status == "Off"): 
      print("Lights have been switched off") 
    else: 
      GPIO.output(11, True) 
+0

你的溶液可以通過除去重複的代碼和不必要的塊進行清洗。但是,您想要達到的結果是什麼?將光線切換30次? – 2013-03-25 16:47:26

+0

是的,燈光應在15秒內切換30次。 – user2207573 2013-03-25 18:57:37

回答

1

部分是while循環 - 你不需要因爲任何類型的循環你有事件循環。

這裏的切換的標籤每500ms進行30秒的示例:

import Tkinter as tk 

class Example(tk.Frame): 

    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
     self._job_id = None 

     self.led = tk.Label(self, width=1, borderwidth=2, relief="groove") 
     self.start_button = tk.Button(self, text="start", command=self.start) 
     self.stop_button = tk.Button(self, text="stop", command=self.stop) 

     self.start_button.pack(side="top") 
     self.stop_button.pack(side="top") 
     self.led.pack(side="top") 

    def stop(self): 
     if self._job_id is not None: 
      self.after_cancel(self._job_id) 
      self._job_id = None 
      self.led.configure(background="#ffffff") 

    def start(self): 
     self._job_id = self.after(500, lambda: self.toggle(60)) 

    def toggle(self, counter): 
     bg = self.led.cget("background") 
     bg = "#ffffff" if bg == "#ff0000" else "#ff0000" 
     self.led.configure(background=bg) 
     if counter > 1: 
      self._job_id = self.after(500, lambda: self.toggle(counter-1)) 

root = tk.Tk() 
Example(root).pack(side="top", fill="both", expand=True) 
root.mainloop()