我正试图用tkinter在python中制作一个滑块,并让一个循环不断更新滑块中的数据。在最终产品中,我想要一排发光二极管逐字逐句地点亮滑块。问题是while循环停止了其余代码的工作,并且带有滑块的窗口无法打开。这是我的代码:
import RPi.GPIO as GPIO
from tkinter import *
GPIO.setmode(GPIO.BCM)
GPIO.setup(26, GPIO.OUT)
GPIO.setwarnings(False)
def value():
led.get()
master = Tk()
master.geometry('100x100')
led = Scale(master, from_=5, to=1)
led.pack()
while True:
print(value())
mainloop()
tkinter
有root.after(millisecond, function)
以一定的延迟运行函数,您可以使用它来重复某些函数,因此它将类似于循环工作,但不会阻止mainloop()
import tkinter as tk # PEP8: `import *` is not preferred
# --- function ---
def value():
print(led.get())
# run again after 1000ms
master.after(1000, value)
# --- main --
master = tk.Tk()
led = tk.Scale(master, from_=5, to=1)
led.pack()
# run first time at once
#value()
# or run fist time after 1000ms
master.after(1000, value)
master.mainloop()
BTW:在after()
中,您必须使用不带()
和参数的函数名。如果您需要使用参数运行,则master.after(1000, value, arg1, arg2, ...)
PEP 8——Python代码的样式指南
BTW:您可以将函数分配给Scale
,它将在"Scale changes value"(缩放更改值(时运行它,并且您不需要循环来检查它。
import tkinter as tk # PEP8: `import *` is not preferred
# --- function ---
def on_change(new_value):
print(led.get())
print(new_value)
# --- main --
master = tk.Tk()
led = tk.Scale(master, from_=5, to=1, command=on_change)
led.pack()
master.mainloop()
文档(effbot.org(:Scale