Tkinter 창을 어떻게 닫습니까?


87

Tkinter 프로그램을 종료하려면 어떻게합니까? 이 코드가 있다고 가정 해 봅시다.

from Tkinter import *

def quit():
    # code to exit

root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()

quit내 응용 프로그램을 종료 하는 기능을 어떻게 정의해야 합니까?

답변:


120

destroy()tkinter 창을 닫으려면를 사용해야 합니다.

from Tkinter import *

root = Tk()
Button(root, text="Quit", command=root.destroy).pack()
root.mainloop()

설명:

root.quit()

위의 라인은 우회root.mainloop() 즉,이 root.mainloop()경우 여전히 백그라운드에서 실행됩니다 quit()명령이 실행됩니다.

root.destroy()

destroy()명령이 사라지는 동안 root.mainloop()root.mainloop()중지합니다.

그냥 프로그램을 종료 할대로 사용해야하므로 그래서 root.destroy()같이 IT는 중지됩니다 mainloop().

그러나 무한 루프를 실행하고 Tk 창을 파괴하고 싶지 않고 root.mainloop()줄마다 코드를 실행하고 싶다면 root.quit(). 전의:

from Tkinter import *
def quit():
    global root
    root.quit()

root = Tk()
while True:
    Button(root, text="Quit", command=quit).pack()
    root.mainloop()
    #do something

2
root.quit ()를 사용하면 나중에 다른 스크립트에서 창을 다시 찾을 수 있습니까 (시스템 리소스를 계속 사용하지 않도록)?
Raj

3
첫 번째 진술은 거짓입니다. 호출 quit하면 모든 위젯이 파괴됩니다. 위젯이 파괴 mainloop되면 종료됩니다.
Bryan Oakley

1
몇 가지 조사 후 나는 이것이 실행되는 모든 코드에도 적용된다고 생각합니다. 따라서 명령 줄 스크립트에 TKinter의 mainloop ()가있는 경우 root.destroy ()가 아닌 root.quit ()를 사용하십시오. 그렇지 않으면 명령 줄 스크립트가 mainloop () 이후에 코드를 계속 실행하지 않습니다. 나는 이것을 테스트했고 그것은 나를 위해 작동합니다 (나는 TKinter가 그러한 디자인에 사용되도록 의도되지 않았지만 작동한다는 것을 알고 있습니다)
Alex

그것은 많은 시간을 Tkinter의 창을 여러 번 파괴하고 시작하는 좋은 솔루션입니다
Nitesh Waghmare


17
import Tkinter as tk

def quit(root):
    root.destroy()

root = tk.Tk()
tk.Button(root, text="Quit", command=lambda root=root:quit(root)).pack()
root.mainloop()

7

Python 프로그램을 종료하는 일반적인 방법 :

sys.exit()

(종료 상태를 전달할 수도 있음) 또는

raise SystemExit

Tkinter 프로그램에서 잘 작동합니다.


3
문제는 tkinter를 사용하는 프로그램이 아니라 tkinter 창을 닫는 것에 관한 것이었다.
kevr

7

나는 당신이 Tkinter의 종료 기능을 잘못 이해했다고 생각합니다. 이 함수는 정의 할 필요가 없습니다.

먼저 다음과 같이 함수를 수정해야합니다.

from Tkinter import *
root = Tk()
Button(root, text="Quit", command=root.quit).pack()
root.mainloop()

그런 다음 '.pyw'접미사를 사용하여이 파일을 저장하고 '.pyw'파일을 두 번 클릭하여 GUI를 실행해야합니다. 이번에는 버튼을 클릭하여 GUI를 종료 할 수도 있습니다. 불쾌한 DOS 창이 없습니다. ( '.py'파일을 실행하면 종료 기능이 실패합니다.)


5

혼란시 조명 ...

def quit(self):
    self.destroy()
    exit()

A) destroy ()는 메인 루프를 중지하고 창을 죽이지 만 파이썬은 계속 실행됩니다.

B) exit ()는 전체 프로세스를 중지합니다

누군가 destroy ()가하는 일을 놓친 경우를 명확히하기 위해 OP는 또한 tkinter 프로그램을 "종료"하는 방법을 물었습니다.


3

다음을 입력하기 만하면됩니다.

root.destroy()

그리고 당신이 그것을 commm으로 설정하면 quit () 함수가 필요하지 않으며 전체 프로그램을 종료합니다.


2

누군가가 탈출 버튼을 전체 GUI를 닫는 데 바인딩하려는 경우 :

master = Tk()
master.title("Python")

def close(event):
    sys.exit()

master.bind('<Escape>',close)
master.mainloop()

1

idlelib.PyShell모듈 root형식의 변수는 Tk글로벌 정의된다

PyShell.main()함수 의 끝 root.mainloop()에서 무한 루프 인 함수를 호출하고 함수에 의해 루프가 중단 될 때까지 실행됩니다 root.quit(). 따라서 root.quit()실행을 중단합니다mainloop

idlelib 창과 관련된 모든 위젯을 파괴하려면 함수 root.destroy()의 마지막 줄인 을 호출해야 idlelib.PyShell.main()합니다.


1

당신이 사용할 수있는:

root.destroy()

또는

root.quit()

그래도 작동하지 않으면 루트를 프로그램 시작 부분의 변수로 변경하십시오.

import tkinter

main = Tk()

main.destroy()

main.mainloop

1

가장 쉬운 방법은 빨간색 버튼을 클릭하는 것입니다 (macOS에서는 가장 왼쪽, Windows에서는 가장 오른쪽). 특정 기능을 버튼 위젯에 바인딩하려면 다음과 같이 할 수 있습니다.

class App:
    def __init__(self, master)
        frame = Tkinter.Frame(master)
        frame.pack()
        self.quit_button = Tkinter.Button(frame, text = 'Quit', command = frame.quit)
        self.quit_button.pack()

또는 좀 더 복잡하게 만들려면 프로토콜 처리기와 destroy()메서드를 사용하십시오.

import tkMessageBox

def confirmExit():
    if tkMessageBox.askokcancel('Quit', 'Are you sure you want to exit?'):
        root.destroy()
root = Tk()
root.protocol('WM_DELETE_WINDOW', confirmExit)
root.mainloop()

0
def quit1():
     root.destroy()

Button(root, text="Quit", command=quit1).pack()
root.mainloop()

0
import sys
from Tkinter import *
def quit():
    sys.exit()
root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()

당신이 요구하는 것을해야합니다.


헤이 해리슨, 기존 답변에 대한 추가 정보를 제공하지 않는 매우 늦은 답변이 있습니다. 참여해 주셔서 대단히 감사 드리지만 귀하의 답변은 추가적인 통찰력을 제공하지 않습니다. 예를 들어 다른 답변 중 일부를 살펴보십시오. 일부 접근 방식은 작동하고 다른 접근 방식은 작동하지 않는 이유를 잘 설명합니다.
TheOneWhoPrograms

0

메뉴 모음의 경우 :

def quit():
    root.destroy()

menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)

filemenu.add_separator()

filemenu.add_command(label="Exit", command=quit)
menubar.add_cascade(label="menubarname", menu=filemenu)
root.config(menu=menubar)
root.mainloop()

0

Tkinter 창을 종료하려면 아래 코드를 사용합니다.

from tkinter import*
root=Tk()
root.bind("<Escape>",lambda q:root.destroy())
root.mainloop()

또는

from tkinter import*
root=Tk()
Button(root,text="exit",command=root.destroy).pack()
root.mainloop()

또는

from tkinter import*
root=Tk()
Button(root,text="quit",command=quit).pack()
root.mainloop()

또는

from tkinter import*
root=Tk()
Button(root,text="exit",command=exit).pack()
root.mainloop()

0

아래 코드 스 니펫. 저는 작은 시나리오를 제공하고 있습니다.

import tkinter as tk
from tkinter import *

root = Tk()

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

menubar = Menu(root, background='#000099', foreground='white',
               activebackground='#004c99', activeforeground='white')

fileMenu = Menu(menubar,  tearoff=0, background="grey", foreground='black',
                activebackground='#004c99', activeforeground='white')
menubar.add_cascade(label='File', menu=fileMenu)

fileMenu.add_command(label='Exit', command=exit)

root.config(bg='#2A2C2B',menu=menubar)

if __name__ == '__main__':
    root.mainloop()

나는 빈 창을 여기에 만든 & I는 하나의 옵션 추가 같은 창 (루트 창)에 파일 메뉴 옵션을 추가 한 종료 .

그런 다음 간단히 mainloop실행하십시오. root에 대해 를 .

한번 해봐


0

root.destroy 작동합니다.
root.quit또한 작동합니다.

내 경우에는

quitButton = Button(frame, text = "Quit", command = root.destroy)

도움이 되었기를 바랍니다.



0
from tkinter import *

def quit(root):
    root.close()

root = Tk()
root.title("Quit Window")

def quit(root):
    root.close()

button = Button(root, text="Quit", command=quit.pack()

root.mainloop()

이 코드가 질문에 답할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
ppwater

당신은 )당신 button과 당신의 함수를 잘못 호출하고 있습니다.
Cool Cloud


-2

이 시도:

from Tkinter import *
import sys
def exitApp():
    sys.exit()
root = Tk()
Button(root, text="Quit", command=exitApp).pack()
root.mainloop()

-4

이 시도.

    self.parent.destroy() 
    self.parent.quit()

아마도 당신은 당신이 한 프레임에 루트와 같은 매개 변수를 보낼 수 있습니다. 그래서 당신이 그것을 끝내고 싶다면 당신은 당신의 아버지에게 전화를해서 그의 아이들을 각각 닫는 대신 모든 것을 닫을 수 있도록해야합니다.


4
추측적인 답변을 게시하지 마십시오. 이상적으로는 입증되고 검증 가능한 답변이있을 때만 게시해야합니다. 제안 사항이 있으면 댓글로 갈 수 있습니다.
SuperBiasedMan 2015 년

클래스를 사용할 때 self.parent.destroy ()는 내 상황에서 효과가 있습니다.
Zak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.