2016-06-03 3 views
-1

경우 후 수 없음 입력 :이 코드 조각이 TK

import Tkinter as tk 
import tkFileDialog 

menu = tk.Tk() 
res = tkFileDialog.askopenfilename() # un-/comment this line 
label = tk.Label(None, text="abc") 
label.grid(row=0, column=0, sticky=tk.W) 
entry = tk.Entry(None) 
entry.grid(row=0, column=1, sticky=tk.EW) 

res = menu.mainloop() 

참고하십시오 askopenfilename 그냥 더미 입력합니다. TK의 (현재 차단 된) 메인 창에 가려면 닫으십시오.

내가 askopenfilename에 댓글을 달면 모든 것이 잘 동작합니다. 그러나 그것으로 엔트리에 데이터를 입력 할 수 없습니다.

이는 Windoze 환경에서만 발생합니다. askopenfilename은 주 TK 창에 대한 포커스를 훔치는 것으로 보입니다. 완전히 다른 창을 클릭하고 TK 창에서 다시 돌아온 후에는 입력이 가능합니다.

+0

는, 코드가 잘 클릭으로 운영 체제 내 파일 탐색기에서 파일을 선택하는 날을 제공하지만 다음의 과정이 문자열합니다 (경로)는 사용되지 않습니다. 'text = "abc"레이블을'text = res'로 바꾸면 레이블 상자의 레이블에 파일 경로가 표시됩니다. 질문에 더 많은 기대 또는 관찰을 추가하십시오. 그것이 내게 인상을주지 않는 것처럼 보일 때, 그것은 진짜 대답을받을 것이다 ;-) – Dilettant

+1

@Dilettant 죄송합니다, 저는 서둘러서 질문을 완료 할 수 없었습니다. 나는 더 많은 정보를 추가했다. –

+0

윈도우에서 알려진 버그라고 생각합니다. 대화 상자를 열기 전에'mainloop'이 시작되었는지 확인해야합니다. –

답변

1

나는 이것에 대한 보고서를 보았다. 나는 윈도우에 알려진 버그라고 생각한다. 대화 상자를 열기 전에 mainloop을 시작해야합니다.

앱이 먼저 mainloop가 시작 후 실행하도록 after 또는 after_idle을 사용할 수 있습니다 시작할 때 대화 상자를 표시합니다. 당신이 다른 GUI 코드는 대화 상자가 끝날 때까지 실행하지 않으려면

menu = tk.Tk() 
... 
def on_startup(): 
    res = tkFileDialog.askopenfilename() 

menu.after_idle(on_startup) 
menu.mainloop() 

, 루트 윈도우의 생성을 제외한 모든 코드를 이동하고 on_startup 나에 mainloop에 전화 : 예를 들어

다른 기능. 예를 들어

:

이 질문에 기록되면
def main(filename): 
    label = tk.Label(None, text="abc") 
    label.grid(row=0, column=0, sticky=tk.W) 
    entry = tk.Entry(None) 
    entry.grid(row=0, column=1, sticky=tk.EW) 

def on_startup(): 
    res = tkFileDialog.askopenfilename() 
    main(filename) 

root = Tk() 
root.after_idle(on_startup) 
+0

우수! after_idle은 해결 방법입니다. 감사! –

-1

askopenfilename에는 자체 이벤트 루프가 있습니다. 프로그램은 파일 이름을 선택할 때까지 중지 된 후 계속됩니다.

+0

죄송합니다. 내 질문이 완료되지 않았습니다. –

+0

즉, 내 질문에 대한 답변을 제공하지 않습니다. –

관련 문제