programing

Tkinter에서 창 닫기 이벤트를 어떻게 처리합니까?

nasanasas 2020. 8. 13. 23:26
반응형

Tkinter에서 창 닫기 이벤트를 어떻게 처리합니까?


Python Tkinter 프로그램에서 창 닫기 이벤트 (사용자가 'X'버튼을 클릭)를 어떻게 처리합니까?


Tkinter는 프로토콜 핸들러 라는 메커니즘을 지원합니다 . 여기서 프로토콜 이라는 용어 는 응용 프로그램과 창 관리자 간의 상호 작용을 나타냅니다. 가장 일반적으로 사용되는 프로토콜은라고 WM_DELETE_WINDOW하며 사용자가 창 관리자를 사용하여 창을 명시 적으로 닫을 때 발생하는 작업을 정의하는 데 사용됩니다.

protocol메소드를 사용 하여이 프로토콜에 대한 핸들러설치할 수 있습니다 (위젯은 Tk또는 Toplevel위젯 이어야 함 ).

여기에 구체적인 예가 있습니다.

import tkinter as tk
from tkinter import messagebox

root = tk.Tk()

def on_closing():
    if messagebox.askokcancel("Quit", "Do you want to quit?"):
        root.destroy()

root.protocol("WM_DELETE_WINDOW", on_closing)
root.mainloop()

Matt는 닫기 버튼의 고전적인 수정을 보여주었습니다.
다른 하나는 닫기 버튼을 사용하여 창을 최소화하는 것입니다.
당신은 필요에 의해이 동작을 재현 할 수 있습니다 아이콘 화 방법은
프로토콜 메서드의 두 번째 인수.

다음은 Windows 7에서 테스트 한 작업 예제입니다.

# Python 3
import tkinter
import tkinter.scrolledtext as scrolledtext

class GUI(object):

    def __init__(self):
        root = self.root = tkinter.Tk()
        root.title('Test')

    # make the top right close button minimize (iconify) the main window
        root.protocol("WM_DELETE_WINDOW", root.iconify)

    # make Esc exit the program
        root.bind('<Escape>', lambda e: root.destroy())

    # create a menu bar with an Exit command
        menubar = tkinter.Menu(root)
        filemenu = tkinter.Menu(menubar, tearoff=0)
        filemenu.add_command(label="Exit", command=root.destroy)
        menubar.add_cascade(label="File", menu=filemenu)
        root.config(menu=menubar)

    # create a Text widget with a Scrollbar attached
        txt = scrolledtext.ScrolledText(root, undo=True)
        txt['font'] = ('consolas', '12')
        txt.pack(expand=True, fill='both')

gui = GUI()
gui.root.mainloop()

이 예에서는 사용자에게 두 가지 새로운 종료 옵션,
즉 클래식 파일 메뉴-> 종료 및 Esc버튼을 제공합니다.


Depending on the Tkinter activity, end esp. when using Tkinter.after, stopping this activity with destroy() -- even by using protocol(), a button, etc. -- will disturb this activity ("while executing" error) rather than just terminate it. The best solution in almost every case is to use a flag. Here is a simple, silly example of how to use it (although I am certain that most of you don't need it! :)

from Tkinter import *

def close_window():
  global running
  running = False
  print "Window closed"

root = Tk()
root.protocol("WM_DELETE_WINDOW", close_window)
cv = Canvas(root, width=200, height=200); cv.pack()

running = True;
# This is an endless loop stopped only by setting 'running' to 'False'
while running: 
  for i in range(200): 
    if not running: break
    cv.create_oval(i,i,i+1,i+1); root.update() 

This terminates graphics activity nicely. You only need to check running at the right place(s).


Try The Simple Version:

import tkinter

window = Tk()

closebutton = Button(window, text='X', command=window.destroy)
closebutton.pack()

window.mainloop()

Or If You Want To Add More Commands:

import tkinter

window = Tk()


def close():
    window.destroy()
    #More Functions


closebutton = Button(window, text='X', command=close)
closebutton.pack()

window.mainloop()

Use the closeEvent

def closeEvent(self, event):
# code to be executed

참고URL : https://stackoverflow.com/questions/111155/how-do-i-handle-the-window-close-event-in-tkinter

반응형