0

내 코드의 목적은 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 파일을 삭제 한 후 컴퓨터를 종료하십시오.

나는 하루 종일이 권리를 얻으려고 애썼지 만, 나는 이것이 가능하지 않을 수도 있다는 사실을 깨닫고있다.

당신의 생각을 알려주고 다른 것이 있다면 시도해야합니다.

+0

이것은 가능해야하지만, 고려해야 할 것은 tkinter가 응용 프로그램에서 멀티 스레딩으로 nice *를 수행하지 않는다는 것입니다. 그것은 불가능한 것이 아니라, 당신이 프로그램 할 수있는 재미있는 일이 아닙니다. 용감한 영혼을 경배하십시오. –

답변

0

해결책은 별도의 스레드 또는 프로세스에서 추출을 수행하는 것입니다. 이 두 번째 스레드 또는 프로세스는 대기열을 통해 GUI와 다시 통신 할 수 있습니다. after을 사용하여 GUI 측면에서 대기열을 폴링하여 몇 백 밀리 초마다 대기열을 확인하는 기능을 계속 일정을 변경할 수 있습니다.