<p>我不能在RPi上测试它,但我可以是这样的</p>
<p>普通<code>command=</code>只能在单击按钮时识别,但在释放按钮时无法识别-您需要绑定事件<code><ButtonPress></code>和<code><ButtonRelease></code>,它们将在<code>"mouse left button press"</code>和<code>"mouse left button release"</code>上运行函数</p>
<p>我使用<code>after()</code>延迟运行函数,所以我不需要<code>sleep()</code>和<code>while</code>来阻止<code>mainloop()</code>(它可以冻结所有GUI)</p>
<p>我也不需要<code>while</code>循环,因为我在<code>on_press</code>和<code>on_release</code>内运行所有的<code>after()</code>运行<code>turn_off_led</code>,它们使用<code>after()</code>运行<code>turn_on_led</code>,使用<code>after()</code>再次运行<code>turn_off_led</code>,所以它的工作方式类似于循环</p>
<pre><code>import tkinter as tk # PEP8: `import *` is not preferred
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT)
GPIO.output(8, False)
button_pressed = False # PEP8: preferred `lower_case_names`
# - functions -
def on_press(event):
global button_pressed
button_pressed = True
GPIO.output(8, True)
def on_release(event):
global button_pressed
button_pressed = False
GPIO.output(8, True)
# run after 500ms (0.5s) instead of `sleep`
master.after(500, blink_off)
def blink_off():
if not button_pressed:
GPIO.output(8, False)
# run after 500ms (0.5s) instead of `sleep`
master.after(500, blink_on)
def blink_on():
if not button_pressed:
GPIO.output(8, True)
# run after 500ms (0.5s) instead of `sleep`
master.after(500, blink_off)
# - main -
master = tk.Tk()
button = tk.Button(master, text="Turn on light")
button.pack()
# here "button" means "tk.Button" and "Button" means "mouse left button"
button.bind('<ButtonPress>', on_press) # mouse left button pressed on tk.Button
button.bind('<ButtonRelease>', on_release) # mouse left button released on tk.Button
# start blinking - it will use `after()` to loop
blink_on()
master.mainloop()
</code></pre>