私のコードの目的は、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ファイルは、それが完了した後、私のコンピュータをシャットダウンします。
私は一日中この権利を取得しようとしてきましたが、これは可能でない可能性があることに気付いています。
あなたの考えをお伝えしてください。他に何かが必要な場合は、試してください。
これが可能ですが、考慮すべき点は、アプリケーションでtkinterがnice *をマルチスレッドで実行しないことです。それは不可能ではありません、あなたがプログラムするのは楽しいことではありません。勇敢な魂を神に伝えます。 –