我正在尝试创建一个智能镜子,可以显示不同的信息,如天气,3天预报,新闻馈送和推文。我已经将所有这些信息打印在一个窗口中,按照我想要的方式排列,但程序的最后一部分需要与程序的其余部分一起工作,这是一个PIR传感器。
我已经测试了传感器,它可以自己工作,但我想不出一种方法来创建窗口,然后让传感器开始扫描数据,基本上是根据范围内是否有人打开或关闭监视器。
正如我所说的,除了我似乎找不到一种方法来显示tkinter窗口,然后让程序开始扫描动作来打开和关闭监视器之外,我已经完成了所有的代码工作。在这一点上,我不需要更新信息(天气,twitter等),我只担心让监视器打开和关闭,或者只是熄灭和重新显示之前拉出的信息,当一个人在范围内。
我有一个在开始时用来更改监视器状态的示例,因为在我决定寻求帮助之前,这是我尝试放置它的最后一个位置。
从我使用它所获得的经验来看,当程序的主循环部分被调用时,它似乎不能调用其他函数。我可能错了,但事情看起来就是这样。
我已经将程序精简为我想要的窗口功能。因此,使用下面提供的代码,在创建显示器之后,我需要实现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()发布于 2017-05-03 00:23:56
你不能让一个带有infinate while循环的tkinter程序同时期望tkinter主循环运行。
建议您使用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配合使用,并允许主循环运行。
https://stackoverflow.com/questions/43730137
复制相似问题