【问题标题】:How do I run a loop while having a separate tinter code running如何在运行单独的 tinter 代码时运行循环
【发布时间】:2020-04-15 20:56:27
【问题描述】:

我正在尝试使用 tkinter 在 python 中制作一个滑块,并有一个循环不断更新滑块中的数据。在最终产品中,我想要一排 LED 逐字点亮滑块。问题是 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),您可以使用它来更改某些内容并再次运行 root.after(millisecond, function) 稍后再进行更改,等等。
  • 也许你应该在Scale 改变值时使用Scale(..., command=on_change) 来运行函数on_change - 你将不需要循环。看我的回答。

标签: python loops tkinter


【解决方案1】:

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() 

顺便说一句:在after() 中,您必须使用不带() 且不带参数的函数名称。如果您需要使用参数运行,那么master.after(1000, value, arg1, arg2, ...)


PEP 8 -- Style Guide for Python Code


顺便说一句:您可以将函数分配给Scale,它会在 `Scale 更改值时运行它 - 您无需循环检查它。

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

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 2021-07-31
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2021-01-31
    • 2011-11-17
    • 1970-01-01
    • 2018-02-28
    相关资源
    最近更新 更多