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
更新小部件并重绘它们。
我目前正在使用 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
更新小部件并重绘它们。