Я не могу проверить его на RPi, но я мог бы выглядеть примерно так.
Обычный command=
может распознавать только когда вы нажали кнопку, но не может распознать, когда вы отпустили его - вам нужно события связывания <ButtonPress>
и <ButtonRelease>
, которые будут запускать функции на "mouse left button press"
и "mouse left button release"
Я использую after()
для запуска функции с задержкой, поэтому мне не нужны sleep()
и while
который может заблокировать mainloop()
(и он может заморозить все GUI).
И мне также не нужны while
l oop, потому что я запускаю все внутри on_press
и on_release
и позже after()
запускает turn_off_led
, которые используют after()
для запуска turn_on_led
которые используют after()
для повторного запуска turn_off_led
, поэтому он работает как l oop.
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()