tkinterウィンドウを閉じるにはどうすればよいですか?


83

Tkinterプログラムを終了するにはどうすればよいですか?私がこのコードを持っているとしましょう:

from Tkinter import *

def quit():
    # code to exit

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

quitアプリケーションを終了する関数をどのように定義する必要がありますか?

回答:


113

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()、それはそれは停止しますよう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 2016年

3
あなたの最初の声明は誤りです。呼び出すquitと、すべてのウィジェットが破棄されます。ウィジェットが破棄された場合、mainloop終了します。
ブライアンオークリー

1
いくつかの調査の後、これは実行されているすべてのコードにも当てはまると思います。したがって、コマンドラインスクリプトにTKinterのmainloop()がある場合は、root.destroy()ではなくroot.quit()を使用してください。そうしないと、コマンドラインスクリプトはmainloop()の後にコードを実行し続けません。私はこれをテストしました、そしてそれは私のために働きます(TKinterがそのようなデザインで使われることを意図されていないことを私は知っています、それにもかかわらず、それは働きます)
Alex

Tkinterウィンドウを何度も破壊し、何度も開始するのは良い解決策
ですか

40
def quit()
    root.quit()

または

def quit()
    root.destroy()

どの方法がより「正しい」か、またはある方法が別の方法よりも読みやすいかを誰かが知っていますか
Opal

8
申し訳ありませんが、私は答えを見つけて、それを共有したいと思いました。root.destroy()メインプログラムループを終了するので使用することをお勧めします。参照:http
オパール

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」ファイルを実行すると、quit関数は失敗します。)


5

混乱した場合の照明...

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

A)destroy()はメインループを停止してウィンドウを強制終了しますが、Pythonは実行したままにします

B)exit()はプロセス全体を停止します

誰かがdestroy()の実行を見逃した場合に備えて明確にするために、OPはtkinterプログラムを「終了」する方法も尋ねました。


3

これを入力するだけです:

root.destroy()

また、コマンドとしてプログラム全体を終了するように設定すると、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()

それが機能しない場合は、rootをプログラムの開始時に変数があったものに変更します

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 2018

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()

ここに空白のウィンドウを作成し、同じウィンドウ(ルートウィンドウ)にファイルメニューオプションを追加しました。ここでは、オプションexitを1つだけ追加します。

次に、rootに対してmainloop実行するだけです。

一度やってみてください


0

root.destroy動作します。
root.quitまた動作します。

私の場合、私は持っていました

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

それが役に立てば幸い。


0

簡単な1行の答えがあります:

exit()コマンドに-を書き込む

それでおしまい!



-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()が私の状況で機能しました。
ザック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.