Tkinter PIR传感器

时间:2017-05-02 04:32:06

标签: python-3.x tkinter motion-detection

我正在尝试创建一个智能镜像,显示不同的信息,如天气,3天预测,新闻Feed和推文。我把所有这些信息打印在一个窗口中,按照我想要的方式进行打印,但是我需要在程序的其余部分中使用的最后一个程序是PIR传感器。

我已经测试了传感器并且它本身可以工作,但是我想不出有办法创建窗口,然后让传感器开始扫描数据以基本上打开或关闭显示器如果有一个人在范围内。

就像我说的那样,除了我无法找到显示tkinter窗口的方法之外,我所有的代码都起作用,然后程序开始扫描运动以打开显示器,关闭。此时我不需要更新信息(天气,推特等),我只担心打开和关闭显示器,或者当一个人在范围内时只是停电并重新显示之前提取的信息。

我有一个例子,说明我在开始时用来改变显示器的状态,因为这是我在决定寻求帮助之前尝试放置它的最后一个地方。

从我使用它获得的是,当程序的主循环部分被调用时,它似乎无法调用其他函数。我错了,但这就是它的样子。

我已经将程序简化为我想要的窗口功能。因此,使用下面提供的代码,我需要实现PIR传感器,以在创建显示后打开和关闭显示。

from tkinter import *
import os, subprocess
from gpiozero import *

pir = MotionSensor (4) 

while True:
if pir.motion_detected:
    subprocess.call('xset dpms force on', shell=True)
    print("yes")
else:
     subprocess.call('xset dpms force off', shell=True)
     print("no")






    #creates a fullscreen window and makes it black. 

       tk = Tk()
       tk.configure(bg='black')
       tk.attributes('-fullscreen', True)


       tk.mainloop()

1 个答案:

答案 0 :(得分:0)

你不能拥有一个带有infinate while循环的tkinter程序,并期望tkinter mainloop能够运行。

建议您使用gpiozero中的回调来调用一个函数,以便在检测到运动时启用屏幕,并且可能使用tkinter.after方法在指定的时间段后关闭屏幕。

def myScreenOnFunction():
    subprocess.call('xset dpms force on', shell=True)
    print("Screen On")

....

pir = MotionSensor (4)
pir.when_motion = myScreenOnFunction

tk = Tk()
tk.configure(bg='black')
tk.attributes('-fullscreen', True)


tk.mainloop()

这样的东西应该可以很好地与Tkinter一起使用并允许主循环运行。