2010-12-29 4 views
0

스레드를 사용하여 tkinter 창 인스턴스를 만들 때 실행 후 창이 파괴되고 스레드가 조인 되어도; 나중에 프로그램 흐름에서 다른 tkinter 창을 만들 수 없습니다. 왜? 내 Google-foo는을 사용하여 수집 할 수 있습니다 무엇에서tkinter 스레드 gui 인스턴스가 더 이상 모든 spawn을 중지합니다

def on_button_click(root): //destroys window on button click 
    root.destroy() 

def init(): //thread calls this 
    root=Tk() 
    b = Button(root, text="OK", command=lambda:on_button_click(root)) 
    b.pack() 
    root.mainloop() 

t = Thread(target=init) 
t.start() 
t.join() 

root=Tk() //program flow halts here with no window being displayed 
root.mainloop() 

답변

1

는, 문제는 (root.mainloop()에 통화 중 생성) TK에 이벤트 루프가 단일 스레드입니다 그리고 당신은 할 수 한 번에 하나의 인스턴스가 있어야합니다. 아마 그것이 그 위치에서 멈추는 이유 일 것입니다. 쓰레드가 Tk 서브 시스템을 제대로 설정하고 있지만, 동시에 실행할 두 번째 Tk 서브 시스템을 만들려고하면 프로그램이 실패합니다. root.destroy()으로 전화하면 생성 한 창만 파괴되며 전체 Tk 하위 시스템은 파괴되지 않습니다.

Tk를 사용한 이후로 꽤 오래되었지만 프로그램을 처음 시작할 때 root.mainloop()을 한 번 호출 한 다음 전체 Tk 하위 시스템이 아닌 Tk 창만 인스턴스화하도록 함수를 남겨 두는 것이 좋습니다.

관련 문제