<p>我认为@furas已经为您确定了正确的方向,但由于我是为了好玩而做的,我想我也会把我的解决方案留在这里。我提取了GPIO代码,以便在本地运行它</p>
<p>这两种解决方案的一个关键特性是,我们已经删除了对<code>time.sleep</code>的调用,因为在<code>time.sleep</code>调用时,Tk的事件循环无法处理任何事件(这将表现为UI在这些睡眠语句期间出现“冻结”)</p>
<pre><code>import time
import tkinter
buttonpressed = False
lastchange = 0
ledstate = False
def button_down(event):
global buttonpressed
print('BUTTON DOWN')
buttonpressed = True
def button_up(event):
global buttonpressed
print('BUTTON UP')
buttonpressed = False
def myloop(master):
global buttonpressed
global lastchange
global ledstate
now = time.time()
delta = now - lastchange
if not buttonpressed:
if now - lastchange > 0.5:
ledstate = not ledstate
print('LED', ledstate)
lastchange = now
else:
if not ledstate:
ledstate = True
print('LED', ledstate)
master.after_idle(myloop, master)
master = tkinter.Tk()
w = tkinter.Button(master, text="Turn on light")
w.bind('<ButtonPress>', button_down)
w.bind('<ButtonRelease>', button_up)
w.pack()
master.after(100, myloop, master)
master.mainloop()
</code></pre>