Tkinter 虚拟 LED

Tkinter virtual LED

我目前正在使用 Tkinter 开发一个可以与 Raspberry Pi 交互的 GUI board.I 想要一个连接到 raspberry pi 的按钮并在 Tkinter GUI 上获得输出指示,例如绿色指示开启,红色表示关闭。

这是我试过的代码:-

from tkinter import *
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
buttonPin=11

GPIO.setup(buttonPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

win = Tk()

def ledON():
    while True:
        if GPIO.input(11) == 1:
            ledButton["bg"] = "green"
        else:
            ledButton["bg"] = "red"

#I tried to use button widget in DISABLED state as a Indicator
ledButton = Button(win, text = "   ", command = ledON,state=DISABLED, height = 2, width =8,bg="red")
ledButton.pack()

mainloop()

请帮帮我。

您不应该使用 while True,因为它一直 运行 并且它会阻止 mainloop 从系统获取 key/mouse 事件,将事件发送到小部件,(重新)绘制小部件等。如果您阻止 mainloop 则它无法工作并且 window 冻结。

您可以使用 win.after(millisecond, function_name) 重复功能而不阻塞 mainloop

import tkinter as tk # PEP8: `import *` is not preferred
import RPi.GPIO as GPIO

# --- function ---

def my_function():
    
    if GPIO.input(11) == 1:
        led["bg"] = "green"
    else:
        led["bg"] = "red"
        
    # repeate function after 100ms (0.1s)
    win.after(100, my_function)
    
# -- main ---

GPIO.setmode(GPIO.BOARD)
buttonPin=11

GPIO.setup(buttonPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

win = tk.Tk()

led = tk.Label(win, text="   ", bg="red")
led.pack()

# run function first time
my_function()

mainloop()

顺便说一句: 如果你真的必须使用 while True 或 运行 长 运行ning 代码那么你可以使用 win.update() 强制 mainloop 更新小部件并重绘它们。