2013-06-14 2 views
0

사용자로부터 정보를 수집하고 파일 복사, DB 업데이트, 사용자 작업 등의 작업을 수행하는 '마법사'유형의 Python Tkinter GUI를 작성하고 있습니다. 등의 처리는 일반적으로 30 초에서 60 초 정도 소요됩니다 그리고 그 시간 동안, 내가 원하는 :X (닫기) 버튼이없는 파이썬 tkinter 창 만들기

  1. 이 활동 및 진행에 텍스트 업데이트를 사용자에게 제공
  2. 방지가 완료 될 때까지 응용 프로그램을 닫는에서 사용자가 무엇을 그것은하고있다

나는 o 길에서 시작했다. f가 trainsient으로 구성된 자식 창에 나타나고 wait_window을 사용하여 활동이 완료 될 때까지 주 루프를 일시 중지합니다. 이것은 윈도우의 destroy 메서드를 호출하는 확인/취소 버튼이있는 다른 사용자 정의 대화 상자에서 잘 작동합니다. 기본 접근 방식은 다음과 같습니다.

def myCustomDialog(parent,*args): 
    winCDLG = _cdlgWin(parent,*args) 
    winCDLG.showWin() 
    winCDLG.dlgWin.focus_set() 
    winCDLG.dlgWin.grab_set() 
    winCDLG.dlgWin.transient(parent) 
    winCDLG.dlgWin.wait_window(winCDLG.dlgWin) 
    return winCDLG.userResponse 

class _cdlgWin(): 
    def __init__(self,parent,*args): 
     self.parent = parent 
     self.dlgWin = tk.Toplevel() 
     self.userResponse = '' 

    def showWin(self): 
     #Tkinter widgets and geometry defined here 

    def _btnOKClick(self): 
     #self.userResponse assigned from user entry/entries on dialog 
     self.dlgWin.destroy() 

    def _btnCancelClick(self): 
     self.dlgWin.destroy() 

그러나이 방법은 내가 만들고자하는 새로운 모니터 및 업데이트 대화 상자에서 작동하지 않습니다.

우선 사용자가 시작한 동작으로 복사/업데이트 작업을 수행 한 다음 destroy을 트리거하기 때문에 showWin 또는 다른 방법으로이 작업을 수행해야합니다. 나는 두 가지 방법을 시도했지만 경쟁 조건 (코드가 복사/업데이트 작업을 완료했지만 그 작업이 완료되기 전에 창을 파괴하려고 시도 함) 사이에 끼어 있으며 복사/업데이트 작업을 절대로 실행하지 않기 때문에 다른 방법을 활성화하기 전에 wait_window에 도달합니다.

내가 그 길을 찾아 낼 수 있다면, 2 차적인 문제 (작업이 끝나기 전에 사용자가 자식 창을 닫지 못하도록하는 것)는 아래 해답에서 다룹니다.

그래서 ... 내가 원하는 방식으로이 접근법을 적용 할 수 있도록 적용 할 수있는 띠무늬가 있습니까? 아니면 작동하지 않아서 이것을 스크랩해야합니까? (그리고 후자라면 원래 목표를 달성 할 수있는 방법이 있습니까?)

답변

2

내가 아는 한 창 제어 단추는 창 관리자가 구현하므로 하나만 제거 할 수는 없다고 생각합니다. 그들과 Tkinter (나는 100 % 확신 할 수 없다). (경계선 창을)

class _cdlgWin(): 
    def __init__(self,parent,*args): 
     self.parent = parent 
     self.dlgWin = tk.Toplevel() 
     self.dlgWin.protocol('WM_DELETE_WINDOW', self.close) 
     self.userResponse = '' 

    def close(self): 
     tkMessageBox.showwarning('Warning!', 
           'The pending action has not finished yet') 
    # ... 
+0

다른 옵션은 대화 상자를 표시하는 대신 사용자가 주 창을 소멸 시키려고하지만 단순히 작업을 마칠 수 있도록 기본 창을 철회하는 것입니다 (사용자가 실제로 사용자를 허용하지 않는 좋은 이유가 있다고 가정 할 때). 바퀴가 움직이면 멈춤) –

+0

이것은 두 번째 문제 (사용자가 너무 빨리 창을 닫지 않도록)를 돕지 만 첫 번째 문제는 여전히 남아 있습니다. 창을 원하는대로 작동하게 만듭니다. 나는 너무 빨리 그것을 detroying 사이에 붙어있는 경쟁 조건을 가지고, 또는 결코 사본/업데이트를 실행. – JDM

4

self.dlgWin.overrideredirect(1)이 버튼을 모두 제거합니다 :이 문제에 대한 일반적인 솔루션은 프로토콜 WM_DELETE_WINDOW에 콜백을 설정하고 윈도우의 동작을 제어하는 ​​데 사용하는 것입니다. 그게 당신이 찾고있는거야?

+0

이것은 두 번째 문제 (사용자가 너무 빨리 창을 닫지 않도록)를 돕지 만, 첫 번째 문제는 여전히 남아 있습니다. 창을 원하는대로 작동하게 만듭니다. 나는 너무 빨리 그것을 detroying 사이에 붙어있는 경쟁 조건을 가지고, 또는 결코 사본/업데이트를 실행. – JDM