【问题标题】:updating python3 tkinter label not working更新 python3 tkinter 标签不起作用
【发布时间】:2018-03-05 23:03:15
【问题描述】:

如果我点击手动按钮,我可以手动更新标签和条目,但如果我点击自动按钮...控制台显示随机数,但小部件没有更新。

from tkinter import *
import random
import time

def manual_settxt():
    for t in range(0,3):
        rd = random.randrange(1,100)
        labelWidgets[t].configure(text=rd)
        entryWidgets[t].delete(0,END)
        entryWidgets[t].insert(0,rd)

def auto_settxt():
    while True:
        time.sleep(3)
        for t in range(0,3):
            rd = random.randrange(1,100)
            print(rd)
            labelWidgets[t].configure(text=rd)
            entryWidgets[t].delete(0,END)
            entryWidgets[t].insert(0,rd)

root = Tk()

namesInput = [1,2,3]
entryWidgets = []
labelWidgets = []

for i in range(0, len(namesInput)):
    labelWidgets.append(Label(root,text=namesInput[i],justify='center'))
    entryWidgets.append(Entry(root,width=5,justify='center'))
    labelWidgets[-1].grid(row=i+1,column=0)
    entryWidgets[-1].grid(row=i+1,column=1)

b1 = Button(root, text = "Manual", command=manual_settxt)
b1.grid(row=4,column=0)

b2 = Button(root, text = "Auto", command=auto_settxt)
b2.grid(row=4,column=1)

root.mainloop()

【问题讨论】:

  • 避免在 tkinter GUI 中使用 sleep()。请改用after()

标签: python-3.x tkinter


【解决方案1】:

您创建了一个无限循环。删除while True。 我重构了一些代码:将 Thread 用于非阻塞功能。 试试这个

from tkinter import *
import random
import time
from threading import Thread

def manual_settxt():
    for index in range(3):
        rd = random.randrange(1,100)
        labelWidgets[index].configure(text=rd)
        entryWidgets[index].delete(0,END)
        entryWidgets[index].insert(0,rd)

def job():
    for index in range(3):
        time.sleep(1)
        rd = random.randrange(1,100)
        print(rd)
        labelWidgets[index].configure(text=rd)
        entryWidgets[index].delete(0,END)
        entryWidgets[index].insert(0,rd)


def auto_settxt():
    Thread(target=job).start()

root = Tk()

namesInput = [1,2,3]
entryWidgets = []
labelWidgets = []

for index, name in enumerate(namesInput):

    labelWidgets.append(Label(root, text=name, justify='center'))
    entryWidgets.append(Entry(root, width=5, justify='center'))

    labelWidgets[-1].grid(row=index+1,column=0)
    entryWidgets[-1].grid(row=index+1,column=1)

b1 = Button(root, text = "Manual", command=manual_settxt)
b1.grid(row=4,column=0)

b2 = Button(root, text = "Auto", command=auto_settxt)
b2.grid(row=4,column=1)

root.mainloop()

【讨论】:

  • Nikolay... 我需要“while True”,因为我将抓取网页以进行数据更改以更新小部件。它需要持续运行。
  • Nikolay... 追加“while” ...然后它不会更新小部件。
  • 如果你不退出循环 -> 你会阻塞 GUI,它会冻结。我希望您了解 gui 的工作原理。您在其他线程中启动解析器。这是个好主意。
  • 避免在 tkinter GUI 中使用 sleep()。请改用after()
  • 听从 Mike 的建议,避免阻塞函数和无限循环。
【解决方案2】:

我使用“root.after”,脚本似乎运行良好。

from tkinter import *
import random
import time

def manual_settxt():
    for index in range(3):
        rd = random.randrange(1,100)
        labelWidgets[index].configure(text=rd)
        entryWidgets[index].delete(0,END)
        entryWidgets[index].insert(0,rd)

def auto_settxt():
        for index in range(3):
            rd = random.randrange(1,100)
            print(rd)
            labelWidgets[index].configure(text=rd)
            entryWidgets[index].delete(0,END)
            entryWidgets[index].insert(0,rd)
        root.after(1000, auto_settxt)

root = Tk()

namesInput = [1,2,3]
entryWidgets = []
labelWidgets = []

for index, name in enumerate(namesInput):

    labelWidgets.append(Label(root, text=name, justify='center'))
    entryWidgets.append(Entry(root, width=5, justify='center'))

    labelWidgets[-1].grid(row=index+1,column=0)
    entryWidgets[-1].grid(row=index+1,column=1)

b1 = Button(root, text = "Manual", command=manual_settxt)
b1.grid(row=4,column=0)

b2 = Button(root, text = "Auto", command=auto_settxt)
b2.grid(row=4,column=1)

root.after(1000, auto_settxt)
root.mainloop()

【讨论】:

  • auto_settext() 是通过按下按钮调用的,因此应删除倒数第二行的“root.after(1000, auto_settxt)”。
  • 谢谢 curly... 我的错,我可以知道这是什么意思“labelWidgets[-1]”
  • 您可以回答自己的问题,打印 labelWidgets,然后打印 labelWidgets[-1](它最初不是来自您的代码)。此外,要完整,您应该有一个调用函数的退出或退出程序按钮。该函数调用 after_cancel() 以免后挂effbot.org/tkinterbook/widget.htm 该函数调用root.quit() 退出程序。
  • 当我尝试“print('minus', labelWidgets[-1])”和“print('num', labelWidgets)”时,“打印 labelWidgets,然后打印 labelWidgets[-1]” ” ...我不明白返回打印的消息。我想知道为什么我们必须设置 [-1],我将附加“root.quit()”并感谢 Curly,希望我能给你投票。
猜你喜欢
  • 2014-08-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多