Python 3.x Tkinter PIR传感器
我正在尝试创建一个智能镜像,显示不同的信息,如天气、3天预报、新闻提要和推特。我将所有这些信息打印在一个窗口中,按照我的意愿进行排列,但我需要的程序的最后一部分是PIR传感器 我已经测试了传感器,它可以自己工作,但我想不出一种方法来创建窗口,然后让传感器开始扫描数据,以便根据范围内是否有人打开或关闭监视器 就像我说的,我所有的代码都在运行,除了我似乎无法找到一种方法来显示tkinter窗口,然后让程序开始扫描运动来打开和关闭显示器。在这一点上,我不需要更新信息(天气、twitter等),我只担心显示器的打开和关闭,或者当一个人在射程内时,只需要断电并重新显示先前提取的信息 我举了一个例子,说明我在开始时一直在使用什么来更改监视器的状态,因为这是我决定寻求帮助之前最后一次尝试放置监视器的地方 从使用它中我得到的是,当调用程序的mainloop部分时,它似乎无法调用其他函数。我可能错了,但这就是它看起来的样子 我已经将程序精简到我想要的窗口功能。因此,使用下面提供的代码,我需要实现PIR传感器,以便在创建显示器后打开和关闭显示器Python 3.x Tkinter PIR传感器,python-3.x,tkinter,motion-detection,Python 3.x,Tkinter,Motion Detection,我正在尝试创建一个智能镜像,显示不同的信息,如天气、3天预报、新闻提要和推特。我将所有这些信息打印在一个窗口中,按照我的意愿进行排列,但我需要的程序的最后一部分是PIR传感器 我已经测试了传感器,它可以自己工作,但我想不出一种方法来创建窗口,然后让传感器开始扫描数据,以便根据范围内是否有人打开或关闭监视器 就像我说的,我所有的代码都在运行,除了我似乎无法找到一种方法来显示tkinter窗口,然后让程序开始扫描运动来打开和关闭显示器。在这一点上,我不需要更新信息(天气、twitter等),我只担心
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()
您不能让tkinter程序使用infinate while循环并期望tkinter Main循环运行 建议您使用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配合使用,并允许主循环运行。我建议尽可能减少该示例的内容—这需要大量的代码。例如,对于这个特定问题,您真的需要
切换_全屏
和结束_全屏
功能吗?你真的需要所有这些标签和图片吗?请看,我已经细化了代码以便于筛选。检测到的pir.motion\u是否阻塞或运行时间较长,或者它是相当瞬时的?pir.motion\u detected很快,但更好的方法是使用pir.when\u运动回调。因此,我可以使用tkinter回调的一个示例,类似于.after
回调?当我使用此功能时,我会在一段时间后调用一个函数来禁用显示,但我是否需要重新调用。When_motion
或它只是无限期地继续查看?设置为。When_motion
的函数将在检测到任何运动时被调用,直到程序结束。是的,您可以使用.after
在指定时间段后调用该函数。