2013-08-15 1 views
0

제목에서 알 수 있듯이 Tkinter 메인 루프 내에서 os.walk을 사용하려고합니다. 파이썬 3.3.0을 사용하고 있습니다.Tkinter 메인 루프 내에서 os.walk 사용

기본적으로 버튼을 누르면 목록의 요소를 반복하는 루프에 을 입력하는 인터페이스가 있습니다 (이 경우 나중에 압축 해제되는 아카이브 이름 임). 이후에는 일부 비교 옵션을 수행하려면 os.walk 루프를 사용하십시오. 메인 윈도우에 아무것도 표시하지 않으면 문제가되지 않습니다. 시간이 좀 걸릴 것으로 예상했기 때문에 전체 작업을 수행하는 데 걸리는 시간을 기록하고 예상하기 위해 한 쌍의 시간 카운터를 추가 할 계획이었습니다.

나는 루프가 종료 될 때까지 그러므로 타이머가 업데이트되지 않을 것이다, 내가 또는 에 대한 를 입력 할 경우 mainloop() 내부 루프 내가 mainloop 굶주리는 끝날 것 동안 것을 알고있다. 나는 또한 w.update_idletasks()에 대해 알고 있지만 루프 내부의 내용 만 업데이트하는 것으로 보입니다.

mainloop 안에있는 동안 루프하는 가장 좋은 방법은 함수를 재귀 적으로 호출하는 것입니다 (콜백 메커니즘 또는 return 문을 통해). 그러나 os.walk은 생성기이므로 재귀 함수로 변환하는 방법을 알지 못합니다.

for file in ziplist: 
    try: 
     # some code in here 

     for dirpath, dirnames, filenames in os.walk(zipdirpath): 
      for files in filenames: 
       filepath = os.path.join(dirpath,files)[len(zipdirpath)+1:] 
       size += os.stat(os.path.join(dirpath,files)).st_size 
       print(filepath) 
       left.append(filepath) 
     print(size) 

     # some code in here 

    except: 
     # some code in here 

    finally: 
     # some code in here 

내가 변환 할 수 있습니다 (또는 적어도 나는 내가 할 수있는 생각) 이런 일에 첫 번째 루프 :

def callback(): # to be called by Tkinter 
    def func(index=0): 
     if index > len(ziplist): 
      return 

     # some code in here 

     index += 1 
     func(index) 
다음

문제의 (간체) 코드의 조각이다

그러나 os.walk 루프를 사용하여 동일한 작업을 수행하는 방법에 대해 약간 당황 스럽습니다. 그러므로 제 질문입니다.

편집 : 답변을 찾은 것 같습니다. next(os.walk(...))을 사용하면 궁극적으로 (터플로) 필요한 모든 것을 얻을 수 있습니다. 그러나 나는 아직도 다른 대답을 듣고 싶다.

답변

0

나는 마지막으로이 문제를 해결했고, 나는 "솔루션"이 :의

첫째, return function() 문을 사용하거나 바로 function()를 호출하는 이벤트 루프를 굶주리는 끝납니다. 따라서 모든 관련 함수를 w.after 또는 w.after_idle을 통해 재귀 적으로 호출해야합니다.

마지막으로, 스스로를 호출하는 함수는 재귀를 포함합니다. 일부 긴 프로세스의 경우 궁극적으로 프로그램이 중단 될 수 있습니다. 그러나 Tkinter 이벤트 루프는이 모든 것을 다르게 관리합니다.


이 두 ...

for dirpath, dirnames, filenames in os.walk(path): 
    print(dirpath, dirnames, filenames) 

... 이러한 ... 코드

walk_object = os.walk(path) 
def func(): 
    global walk_object 
    try: 
     dirpath, dirnames, filenames = next(walk_object) 
     print(dirpath, dirnames, filenames) 
     func() # or w.after(0,func) or w.after_idle(func) 
    except StopIteration: 
     return 
func() 

... 라인 출력과 동일한 것이다.