0

私はいくつかの時間のかかる操作を実行する 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()
4

1 に答える 1

0

間違いなく、プログレスバーを更新する唯一の方法は、再描画を要求するイベントを処理できるようにイベント ループを実行することです。アプリケーションをスリープ状態にしたり、機能を長時間実行したりすると、イベント ループは要求を処理できなくなります。

これは、 または を呼び出すupdateupdate_idletasks、実行時間の長い関数をリファクタリングしてイベント ループを操作するか、この関数を別のプロセスまたはスレッドで実行する必要があることを意味します。

于 2013-05-06T12:39:06.180 に答える