为什么进度条不能使用“ print”命令,而不能使用tkinter?

问题描述 投票:0回答:1

我想了解为什么此代码:

import time

for i in range(1,11):
    print(i)
    time.sleep(1)

显示(应显示!)从1到10的数字,每1秒显示一次,而此代码:

from tkinter import *
import time

root = Tk()

for i in range(1,11):
    Label(root, text = i).grid(row=0, column=i-1, padx=5, pady =5)
    time.sleep(1)

root.mainloop()

等待10秒钟,然后显示一个包含10个数字的窗口(而不是一个一个地添加)。我知道这是一个愚蠢的问题,但我真的听不懂!非常感谢!亚历山德罗

python tkinter printing progress-bar progress
1个回答
1
投票

大多数GUI的工作与您期望的不同。

它们以异步方式工作,这意味着,您需要设置窗口并启动事件循环。此事件循环将显示您在调用事件循环之前设置的所有小部件,标签等,并等待任何事件(GUI事件,例如鼠标或键盘事件,计时器事件,甚至是网络事件)。

遇到任何事件时,将调用与该事件相关的代码,并且该代码可以请求更改GUI(显示或隐藏元素,更改图形小部件的标签或属性)。但是仅对GUI进行更改当您将控制权交还给主循环时(当处理事件的代码完成时)执行]

在给定的代码中,您可以使用睡眠语句在for循环中更改标签,但是只有在for循环完成之后,才可以调用主循环,并且此时将显示GUI的最终状态。] >

所以您遇到的几乎是所有GUI /异步类型的应用程序的已知问题。

您必须重写代码,以便启动一个计时器事件,并且在计时器事件触发时,一个函数将设置标签并将计数器增加1。如果计数器不是11,它将重新启动另一个计时器

© www.soinside.com 2019 - 2024. All rights reserved.