3

プログレスバーと他のいくつかの作業を同時に実行する方法を知りたいのですが、作業が完了したら、Python(2.7.x)でプログレスバーを停止します。

import sys, time
def progress_bar():
 while True:
  for c in ['-','\\','|','/']:
   sys.stdout.write('\r' + "Working " + c)
   sys.stdout.flush()
   time.sleep(0.2)

def work():
 *doing hard work*

どうすれば次のようなことができますか?

progress_bar() #run in background?
work()
*stop progress bar*
print "\nThe work is done!"
4

2 に答える 2

8

モジュールを使用してthreading、バックグラウンドでスレッドを実行できます。例えば:

def run_progress_bar(finished_event):
    chars = itertools.cycle(r'-\|/')
    while not finished_event.is_set():
        sys.stdout.write('\rWorking ' + next(chars))
        sys.stdout.flush()
        finished_event.wait(0.2)


# somewhere else...
finished_event = threading.Event()
progress_bar_thread = threading.Thread(target=run_progress_bar, args=(finished_event,))
progress_bar_thread.start()
# do stuff
finished_event.set()
progress_bar_thread.join()
于 2012-11-25T03:11:54.620 に答える
5

プログレスバーを表示する別のスレッドを作成できます。これは@icktoofayの回答に示されているように実行できますが、タスクの新しいスレッドサブクラスを派生させる次の実装のようなものをお勧めします。このアプローチの利点の1つは、すべてが新しいクラスの各インスタンスに自己完結しているため、それらとメインスレッド間の通信にグローバル変数が必要ないことです。

import sys
import threading
import time

class ProgressBarThread(threading.Thread):
    def __init__(self, label='Working', delay=0.2):
        super(ProgressBarThread, self).__init__()
        self.label = label
        self.delay = delay  # interval between updates
        self.running = False
    def start(self):
        self.running = True
        super(ProgressBarThread, self).start()
    def run(self):
        label = '\r' + self.label + ' '
        while self.running:
            for c in ('-', '\\', '|', '/'):
                sys.stdout.write(label + c)
                sys.stdout.flush()
                time.sleep(self.delay)
    def stop(self):
        self.running = False
        self.join()  # wait for run() method to terminate
        sys.stdout.write('\r' + len(self.label)*' ' + '\r')  # clean-up
        sys.stdout.flush()

def work():
    time.sleep(5)  # *doing hard work*

pb_thread = ProgressBarThread('Computing')
pb_thread.start()
work()
pb_thread.stop()
print("The work is done!")
于 2012-11-25T12:42:22.203 に答える