因此,我有一个由Raspy控制的LED,还有一个基本GUI,只有一个按钮,我希望它的行为如下:
执行时,指示灯开始闪烁,但按钮不显示。 当我中断程序时,按钮就会出现。为什么?
from tkinter import *
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT)
GPIO.output(8, False)
buttonPressed = False
master = Tk()
def callback():
GPIO.output(8, True)
buttonPressed = True
w = Button(master, text="Turn on light", command = callback)
w.pack()
while True:
if buttonPressed == False:
GPIO.output(8, True)
time.sleep(0.5)
GPIO.output(8, False)
time.sleep(0.5)
else:
GPIO.output(8, True)
tkinter
应用程序需要调用.mainloop()
您还应该使用
.after(...)
函数来模拟while循环:我不能在RPi上测试它,但我可以是这样的
普通
command=
只能在单击按钮时识别,但在释放按钮时无法识别-您需要绑定事件<ButtonPress>
和<ButtonRelease>
,它们将在"mouse left button press"
和"mouse left button release"
上运行函数我使用
after()
延迟运行函数,所以我不需要sleep()
和while
来阻止mainloop()
(它可以冻结所有GUI)我也不需要
while
循环,因为我在on_press
和on_release
内运行所有的after()
运行turn_off_led
,它们使用after()
运行turn_on_led
,使用after()
再次运行turn_off_led
,所以它的工作方式类似于循环我认为@furas已经为您确定了正确的方向,但由于我是为了好玩而做的,我想我也会把我的解决方案留在这里。我提取了GPIO代码,以便在本地运行它
这两种解决方案的一个关键特性是,我们已经删除了对
time.sleep
的调用,因为在time.sleep
调用时,Tk的事件循环无法处理任何事件(这将表现为UI在这些睡眠语句期间出现“冻结”)相关问题 更多 >
编程相关推荐