【问题标题】:How to update Ttk.Progressbar in Python?如何在 Python 中更新 Ttk.Progressbar?
【发布时间】:2013-05-06 12:30:59
【问题描述】:

我有一个 siplme GUI,可以执行一些耗时的操作。我想制作一个在每次操作后都会更新的进度条。但是,这似乎是不可能的。

update 或 update_idletask 没有解决方案有效(或者我以错误的方式使用它)。所以目标是在每次循环迭代中更新进度条。而使用 .after() 的解决方案不适合在这里,因为该功能是通过按钮单击运行的。

示例代码:

from tkinter import *
from tkinter.ttk import Progressbar
from time import sleep

def RunThat():
   global pb
   for i in range(0,101,10):
      pb["value"]=i
      pb.update()  #this works
      sleep(0.1)
      print(i)

master=Tk()

Label(master,text="Doing something...").grid(row=0,column=0,pady=10)
Grid.columnconfigure(master,0,weight=1)
Label(master,text="Progress:",justify=LEFT).grid(row=1,column=0,padx=25,pady=2,sticky=W+S)
Grid.rowconfigure(master,1,weight=1)
pb=Progressbar(master)
pb.grid(row=2,column=0,padx=25,pady=2,sticky=W+E)   
pb["maximum"]=100
pb["value"]=0  
Button(master,text="Do it",command=RunThat).grid(row=3,column=0,padx=5,pady=5)

master.mainloop()

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案1】:

    毫无疑问,更新进度条的唯一方法是让事件循环运行,以便它可以为请求重绘的事件提供服务。当您要求应用程序休眠或长时间运行时,事件循环无法为请求提供服务。

    这意味着您必须调用updateupdate_idletasks,重构长时间运行的函数以使用事件循环,或者您需要在单独的进程或线程中运行此函数。

    【讨论】:

    • 但正如我所写,在我的应用程序更新或 update_idletasks 中不起作用。但奇怪的是,他们工作的示例代码。那我错过了什么?
    • @misery:您的示例没有调用其中任何一个。我们应该猜测您是如何尝试使用它们的吗?
    • 示例代码和我的应用程序代码之间的唯一区别是我的应用程序中的 pb 是框架的子框架,即主框架的子框架。这可能是一个原因吗?
    • 该死的,多么愚蠢的错误,另一个进度条同名。对不起。我投票结束这个问题。更新作品。
    • 在 MacOS Sierra 上运行 2.7.11。 update_idletasks 不能单独工作,但将它与 update 一起使用就可以了。
    猜你喜欢
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2013-05-04
    • 2012-10-20
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    相关资源
    最近更新 更多