사용자로부터 정보를 수집하고 파일 복사, DB 업데이트, 사용자 작업 등의 작업을 수행하는 '마법사'유형의 Python Tkinter GUI를 작성하고 있습니다. 등의 처리는 일반적으로 30 초에서 60 초 정도 소요됩니다 그리고 그 시간 동안, 내가 원하는 :X (닫기) 버튼이없는 파이썬 tkinter 창 만들기
- 이 활동 및 진행에 텍스트 업데이트를 사용자에게 제공
- 방지가 완료 될 때까지 응용 프로그램을 닫는에서 사용자가 무엇을 그것은하고있다
나는 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 차적인 문제 (작업이 끝나기 전에 사용자가 자식 창을 닫지 못하도록하는 것)는 아래 해답에서 다룹니다.
그래서 ... 내가 원하는 방식으로이 접근법을 적용 할 수 있도록 적용 할 수있는 띠무늬가 있습니까? 아니면 작동하지 않아서 이것을 스크랩해야합니까? (그리고 후자라면 원래 목표를 달성 할 수있는 방법이 있습니까?)
다른 옵션은 대화 상자를 표시하는 대신 사용자가 주 창을 소멸 시키려고하지만 단순히 작업을 마칠 수 있도록 기본 창을 철회하는 것입니다 (사용자가 실제로 사용자를 허용하지 않는 좋은 이유가 있다고 가정 할 때). 바퀴가 움직이면 멈춤) –
이것은 두 번째 문제 (사용자가 너무 빨리 창을 닫지 않도록)를 돕지 만 첫 번째 문제는 여전히 남아 있습니다. 창을 원하는대로 작동하게 만듭니다. 나는 너무 빨리 그것을 detroying 사이에 붙어있는 경쟁 조건을 가지고, 또는 결코 사본/업데이트를 실행. – JDM