내 코드의 목적은 tkinter를 통해 진행률 표시 줄을 생성하고 진행률 표시 줄에 진행률을 표시하는 것입니다. 서브 프로세스 호출을 통해 .7z 파일을 추출하고 싶습니다. 7 -지퍼.스레드 블로킹없이 서브 프로세스를 통해 비동기 작업 수행
7-Zip 파일을 추출한 후 컴퓨터를 종료하고 싶습니다. 첫 번째 문제는 7-Zip 파일을 추출하는 줄 뒤의 코드 줄이 대기없이 컴퓨터를 실행하고 종료한다는 것입니다.
이 점을 고려하여 진행하기 전에 추출이 끝날 때까지 기다려야합니다. catch-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 *를 수행하지 않는다는 것입니다. 그것은 불가능한 것이 아니라, 당신이 프로그램 할 수있는 재미있는 일이 아닙니다. 용감한 영혼을 경배하십시오. –