2017-12-01 11 views
0

Tkinterを使用してguiアプリケーションを作成しています。これは時間のかかる機能を含む外部の.pyファイルに格納された他のコードをインポートします。私がしたいことは、インポートされたスクリプトで実行されているいくつかの関数に従って更新されるGUIウィンドウ上にプログレスバーを置くことです。インポートされたコードからのTkinter更新プログレスバー

桂スクリプト例:

#gui script 
import tkinter 
from tkinter import ttk 
from somefile import somefunc 

progcomp = ttk.Progressbar(root, orient='horizontal', length=200, mode = 'determinate', maximum=100) 
somefunc() 

外部関数の例:

#somefile.py 
def somefunc(): 
    for i in range(1000): 
     #dosomething 
     #update progressbar of gui script 

私の実際のコードは、このような質問に表示するには長すぎるので、私は単純に可能な限りそれを表現することを選びました。私の質問は、これが可能なのか、それとも達成するためにインフラストラクチャを変えなければならないのでしょうか?

+0

よりよい:' – furas

+0

はそれがするので 'for'ループが問題になります長時間実行'mainloop()'を止めてウィンドウがフリーズするようにします。 – furas

+0

@furas私はすでにそれを試しましたが、somefunc()が返ってきたときだけバーが更新されるようです。 – Tsaras

答えて

1

スレッドを使用してこれを実装できます。以下は非常に大まかな例です。 `デフsomefunc(PROGRESS_BAR)

threaded_task.py

import threading 
import time 

class ThreadedTask(threading.Thread): 
    def __init__(self, progress): 
     threading.Thread.__init__(self) 
     self.progress = progress 
    def run(self): 
     for i in range(100): 
      self.progress.step(1) # Update progress bar 
      time.sleep(1) # Simulate long running process 

main.py

from tkinter import * 
from tkinter import ttk 
from threaded_task import ThreadedTask 

root = Tk() 
progcomp = ttk.Progressbar(root, orient='horizontal', length=200, mode = 'determinate', maximum=100) 
progcomp.grid() 

task = ThreadedTask(progcomp) 
task.start() 

root.mainloop() 
関連する問題