2017-05-05 4 views
0

私は現在、ラズベリーパイにセキュリティシステムを構築しようとしています。私はコードを入力するための9つのボタンがあります。コードが入力されたら、uを押してシステムをアームすることができます。次に、機能がPIRセンサの動きをチェックします。動きが検出されると、アラームが消えるはずです。そのためには、時間が必要です。スリープ。 私の実際の問題は、time.sleepで、私は時間のためのプログラムをブロックするので、私は警戒モード中にシステムを解除することはできません。GUIとボタンのスレッドの作成

これまでのところ私はすべてのことをスレッドに入れていました。しかし、今まで成功していない。 time.sleepにもっと良い解決策がありますか?

+0

PIRセンサーがブロックしているものをチェックしていますか、それとも時間がかかりますか?または、数秒ごとにそれをポーリングすることは可能ですか? –

+0

PIRがブロックしていません。アラームがトリガーされると、ブザーは2秒ごとに音を出します。したがって、ブザーをHIGHに設定してから2秒間スリープ状態にしてから、ブザーを再びLOWに設定する必要があります。 – Kev

+1

私たちにいくつかのコードを教えてください – gipsy

答えて

1

スレッドを使用する必要はありません。 tkinterを使用すると、メインスレッドで数秒ごとに実行される機能を簡単にスケジューリングして、センサーをチェックしたり、必要な作業を行うことができます。

ここでは、センサのチェックに数百ミリ秒以上かかるとは限りません。それは私がそれをする方法ではありませんが、UIをスリープさせることなく定期的にいくつかの機能を実行させる方法を示しています。あなたの問題は、単に、その後time.sleepを使用するより良い方法を探している場合

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.timeではなくtime.sleepを使用することを検討して、アクションが発生したかを確認するチェックを使用することができます。これにより、すべてのイベント(GUIを含む)をブロックするtime.sleepの使用を避けることができます。

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を使用していない場合は、これが理にかなっています。個人的には、ブライアンのソリューションははるかにエレガントだと思います。特に、更新が必要かどうかを常に確認する必要はありません。

関連する問題