복붙노트

[PYTHON] Tkinter "X"버튼 컨트롤 재정의 (창을 닫는 버튼) [duplicate]

PYTHON

Tkinter "X"버튼 컨트롤 재정의 (창을 닫는 버튼) [duplicate]

사용자가 작성한 닫기 버튼을 누르면 일부 작업이 종료되기 전에 수행됩니다. 그러나 사용자가 창 오른쪽 위의 [X] 버튼을 클릭하여 창을 닫으면이 작업을 수행 할 수 없습니다.

사용자가 [X] 버튼을 클릭했을 때 일어나는 일을 어떻게 무시할 수 있습니까?

해결법

  1. ==============================

    1.저장 창이 모달이어야하는 것처럼 들립니다.

    저장 창이 모달이어야하는 것처럼 들립니다.

    이것이 기본 저장 창인 경우 왜 바퀴를 다시 발명합니까? Tk에는이 목적을위한 tkFileDialog가 있습니다.

    원하는 것이 창을 없애는 기본 동작을 덮어 쓰는 것이라면 다음과 같이하면됩니다.

    root.protocol('WM_DELETE_WINDOW', doSomething)  # root is your root window
    
    def doSomething():
        # check if saving
        # if not:
        root.destroy()
    

    이렇게하면 누군가가 창을 닫을 때 (어떤 방법 으로든) destroy () 호출을 가로 챌 수 있고 원하는 것을 할 수 있습니다.

  2. ==============================

    2.procotol 메서드를 사용하여 WM_DELETE_WINDOW 프로토콜을 함수 호출과 연결하여 다시 정의 할 수 있습니다.이 경우 함수는 on_exit입니다.

    procotol 메서드를 사용하여 WM_DELETE_WINDOW 프로토콜을 함수 호출과 연결하여 다시 정의 할 수 있습니다.이 경우 함수는 on_exit입니다.

    import tkinter as tk
    from tkinter import messagebox
    
    
    class App(tk.Tk):
    
        def __init__(self):
            tk.Tk.__init__(self)
            self.title("Handling WM_DELETE_WINDOW protocol")
            self.geometry("500x300+500+200")
            self.make_topmost()
            self.protocol("WM_DELETE_WINDOW", self.on_exit)
    
        def on_exit(self):
            """When you click to exit, this function is called"""
            if messagebox.askyesno("Exit", "Do you want to quit the application?"):
                self.destroy()
    
        def center(self):
            """Centers this Tk window"""
            self.eval('tk::PlaceWindow %s center' % app.winfo_pathname(app.winfo_id()))
    
        def make_topmost(self):
            """Makes this window the topmost window"""
            self.lift()
            self.attributes("-topmost", 1)
            self.attributes("-topmost", 0)
    
    
    if __name__ == '__main__':
        App().mainloop()
    
  3. ==============================

    3.찾으려는 명령은 wm_protocol이며 "WM_DELETE_WINDOW"를 바인딩 할 프로토콜로 지정합니다. 창 관리자가 창을 닫을 때 호출 할 프로 시저를 정의 할 수 있습니다 ([x] 클릭시 발생).

    찾으려는 명령은 wm_protocol이며 "WM_DELETE_WINDOW"를 바인딩 할 프로토콜로 지정합니다. 창 관리자가 창을 닫을 때 호출 할 프로 시저를 정의 할 수 있습니다 ([x] 클릭시 발생).

  4. ==============================

    4.나는 Tkinter에 대한 참조를 여기에서 발견했다. 그것은 완벽하지는 않지만, 내가 필요한 거의 모든 것을 다룹니다. 섹션 30.3 (이벤트 유형)이 도움이된다고 생각하면 위젯에 "파괴"이벤트가 있음을 알 수 있습니다. 나는 당신의 메인 윈도우 이벤트에 당신의 저축 작업을 맡기는 것이 트릭을해야한다고 생각한다.

    나는 Tkinter에 대한 참조를 여기에서 발견했다. 그것은 완벽하지는 않지만, 내가 필요한 거의 모든 것을 다룹니다. 섹션 30.3 (이벤트 유형)이 도움이된다고 생각하면 위젯에 "파괴"이벤트가 있음을 알 수 있습니다. 나는 당신의 메인 윈도우 이벤트에 당신의 저축 작업을 맡기는 것이 트릭을해야한다고 생각한다.

    mainwindow.overrideredirect (True) (24 절)를 호출하여 제목 표시 줄의 단추를 사용하여 최소화, 크기 조정 및 닫기를 비활성화 할 수도 있습니다.

  5. from https://stackoverflow.com/questions/3295270/overriding-tkinter-x-button-control-the-button-that-close-the-window by cc-by-sa and MIT license