2017-05-05 67 views
0

我正在嘗試在我的樹莓派上構建安全系統。我有9個按鈕來輸入代碼。一旦輸入密碼,你可以按下「手臂」武裝系統。然後一個功能檢查一個PIR傳感器的移動。當檢測到移動時,警報應該熄滅,爲此我需要睡眠時間。 所以我的實際問題是,隨着time.sleep我阻止程序的休眠時間,因此我不能在報警模式下撤防系統。爲GUI和按鈕創建線程

到目前爲止,我的想法只是把所有東西都放入線程中。但迄今沒有成功。有沒有更好的解決方案time.sleep?

+0

檢查PIR傳感器是否阻塞或需要很長時間?或者是否可以每隔幾秒輪詢一次? –

+0

PIR沒有阻塞。當警報觸發時,蜂鳴器每兩秒鐘發出一次聲音。因此,我需要將蜂鳴器設置爲高電平然後再睡2秒,然後再將蜂鳴器設置爲低電平,依此類推。 – Kev

+1

向我們展示一些代碼 – gipsy

回答

1

你不需要使用線程。使用tkinter,您可以輕鬆地安排一項功能,以便在主線程中每隔幾秒運行一次以檢查傳感器或執行任何其他您想要的工作。

下面是一個簡短的設計示例,假設傳感器檢查花費的時間不超過幾百毫秒,這將很好地工作。這並不完全如此,但它說明了如何讓一些函數能夠定期運行,而不必讓UI進入睡眠狀態。

import tkinter as tk 

class App(): 
    def __init__(self): 
     self._job_id = None 
     self.init_gui() 

    def init_gui(self): 
     self.root = tk.Tk() 
     self.button = tk.Button(self.root, width=6, text="Arm", command=self.arm) 
     self.button.pack(padx=20, pady=20) 

    def start(self): 
     self.root.mainloop() 

    def arm(self): 
     self.button.configure(text="Disarm", command=self.disarm) 
     self.poll() 

    def disarm(self): 
     self.button.configure(text="Arm", command=self.arm) 

     if self._job_id: 
      self.root.after_cancel(self._job_id) 

    def poll(self): 
     # ... check the sensor here ... 
     movement = True 

     if movement: 
      print("beep!") 

     self._job_id = self.root.after(2000, self.poll) 
app = App() 
app.start() 
0

如果您的問題被簡單地尋找更好的方法來使用,然後time.sleep,你可以考慮使用了time.time而不是time.sleep然後使用檢查,看看應該發生什麼樣的行動。這將避免使用time.sleep阻止所有事件(包括您的GUI)。作爲一個迅速寫例子來說明這個道理:

from time import time 

millis = lambda: int(time() * 1000) 

def updateAlarm(lastTime, beepRate, currentState): 
    now = millis() 
    if now > (lastTime + beepRate): 
     return (not(currentState), now) 
    return (currentState, now) 


last = millis() #set the first time for the alarm 
rate = 2000 # change state every two seconds 
state = False # the alarm is currently off 

while True: # just for demonstration purposes, while True: won't work inside of a tkinter GUI 
    change = updateAlarm(last, rate, state) 
    if change[0] != state: # if the state has changed, update it and print 
     state = change[0] 
     last = change[1] 
     print(state) 

根據您的實現,這可能更有意義,尤其是如果你不使用Tkinter的。就我個人而言,我認爲Bryan的解決方案更加優雅,尤其是因爲它不需要經常檢查警報是否需要更新。