2017-11-03 19 views
0

私のコードの目的は、tkinterを介して進行状況バーを生成することです。プログレス・バーでプログレス・バーを作成しています。 -zip。スレッド・ブロッキングのないサブプロセスによる非同期タスクの実行

7-Zipファイルを解凍した後、コンピュータをシャットダウンします。これの最初の問題は、7-Zipファイルを抽出し、実行せずにコンピュータを待たずにシャットダウンする行の後のコード行です。

この点を考慮して、抽出が完了するまで待ってから処理を進めてください。このキャッチ22は、進行中のバーがまだ動作しているため、スレッドをブロックできません。私の現在のコードでは、抽出を待つことができますが、すべてのスレッドがブロックされているため、抽出が完了するまで進捗バーは表示されません。

非同期的に言えば、どのようにして目標を達成できますか? 7-Zipファイルを抽出し

class FinishSetup(tk.Toplevel): 

    # progress bar to simulate finishing set up 
    def __init__(self, *args, **kwargs): 
     tk.Toplevel.__init__(self, *args, **kwargs) 
     self.progress = ttk.Progressbar(self, orient="horizontal", 
      length=200, mode="determinate") 
     self.progress.pack() 

     self.bytes = 0 
     self.maxbytes = 0 

     self.size_top() 

    def start(self): 
     self.progress["value"] = 0 
     self.maxbytes = 100000 
     self.progress["maximum"] = 100000 
     self.read_bytes() 

    def read_bytes(self): 
     self.bytes += 100 
     self.progress["value"] = self.bytes 
     if self.bytes < self.maxbytes: 
      # read more bytes after 100 ms 
      self.after(100, self.read_bytes) 

    def size_top(self): 
     self.resizable(width=False, height=False) 

     ws = self.winfo_screenwidth() 
     hs = self.winfo_screenheight() 

     w = 200 
     h = 22 

     x = (ws/2) - (w/2) 
     y = (hs/2) - (h/2) 

     self.geometry('%dx%d+%d+%d' % (w, h, x, y)) 

     self.protocol("WM_DELETE_WINDOW", self.iconify) 
     self.lift() 
     self.attributes('-topmost', 'true') 
     self.overrideredirect(True) 

そして、私のメインのコード:

は、ここに私のプログレスバーコードだ

私が抽出しながら、私のプログレスバー FinishSetup().start()を実行できるようにする必要があり
archive_name = 'files.7z' 
maps_dir = 'output' 

extract = subprocess.Popen('"C:\\Program Files\\7-Zip\\7z.exe" x ' + archive_name + ' -o' + maps_dir, stdout=subprocess.PIPE) 

for line in iter(extract.stdout.readline,''): 
    print(line.rstrip()) 

print('Finished') 

私の7-Zipファイルは、それが完了した後、私のコンピュータをシャットダウンします。

私は一日中この権利を取得しようとしてきましたが、これは可能でない可能性があることに気付いています。

あなたの考えをお伝えしてください。他に何かが必要な場合は、試してください。

+0

これが可能ですが、考慮すべき点は、アプリケーションでtkinterがnice *をマルチスレッドで実行しないことです。それは不可能ではありません、あなたがプログラムするのは楽しいことではありません。勇敢な魂を神に伝えます。 –

答えて

0

解決策は、別のスレッドまたはプロセスで抽出を実行することです。この第2のスレッドまたはプロセスは、キューを介してGUIと通信することができます。 afterを使用してGUI側でキューをポーリングすると、数百ミリ秒ごとにキューをチェックする機能を継続的に再スケジュールできます。

関連する問題