Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Tkinter PIR传感器_Python 3.x_Tkinter_Motion Detection - Fatal编程技术网

Python 3.x Tkinter PIR传感器

Python 3.x Tkinter PIR传感器,python-3.x,tkinter,motion-detection,Python 3.x,Tkinter,Motion Detection,我正在尝试创建一个智能镜像,显示不同的信息,如天气、3天预报、新闻提要和推特。我将所有这些信息打印在一个窗口中,按照我的意愿进行排列,但我需要的程序的最后一部分是PIR传感器 我已经测试了传感器,它可以自己工作,但我想不出一种方法来创建窗口,然后让传感器开始扫描数据,以便根据范围内是否有人打开或关闭监视器 就像我说的,我所有的代码都在运行,除了我似乎无法找到一种方法来显示tkinter窗口,然后让程序开始扫描运动来打开和关闭显示器。在这一点上,我不需要更新信息(天气、twitter等),我只担心

我正在尝试创建一个智能镜像,显示不同的信息,如天气、3天预报、新闻提要和推特。我将所有这些信息打印在一个窗口中,按照我的意愿进行排列,但我需要的程序的最后一部分是PIR传感器

我已经测试了传感器,它可以自己工作,但我想不出一种方法来创建窗口,然后让传感器开始扫描数据,以便根据范围内是否有人打开或关闭监视器

就像我说的,我所有的代码都在运行,除了我似乎无法找到一种方法来显示tkinter窗口,然后让程序开始扫描运动来打开和关闭显示器。在这一点上,我不需要更新信息(天气、twitter等),我只担心显示器的打开和关闭,或者当一个人在射程内时,只需要断电并重新显示先前提取的信息

我举了一个例子,说明我在开始时一直在使用什么来更改监视器的状态,因为这是我决定寻求帮助之前最后一次尝试放置监视器的地方

从使用它中我得到的是,当调用程序的mainloop部分时,它似乎无法调用其他函数。我可能错了,但这就是它看起来的样子

我已经将程序精简到我想要的窗口功能。因此,使用下面提供的代码,我需要实现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()

您不能让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
在指定时间段后调用该函数。