제목에서 알 수 있듯이 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(...))
을 사용하면 궁극적으로 (터플로) 필요한 모든 것을 얻을 수 있습니다. 그러나 나는 아직도 다른 대답을 듣고 싶다.