163

Python Tkinterプログラムでウィンドウクローズイベント(ユーザーが「X」ボタンをクリック)を処理するにはどうすればよいですか?

4

9 に答える 9

235

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()
于 2008-09-21T14:51:11.373 に答える
41

Matt は、閉じるボタンの 1 つの古典的な変更を示しました。
もう 1 つは、閉じるボタンでウィンドウを最小化することです。iconifyメソッド をプロトコルメソッドの 2 番目の引数に
することで、この動作を再現できます。

これは、Windows 7 および 10 でテストされた実際の例です。

# Python 3
import tkinter
import tkinter.scrolledtext as scrolledtext

root = tkinter.Tk()
# 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')

root.mainloop()

この例では、ユーザーに 2 つの新しい終了オプションを提供します。
従来の [ファイル] → [終了] とEscボタンです。

于 2013-02-11T19:46:39.517 に答える
1

destroy() を使用して tkinter ウィンドウを閉じる必要があります。

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

説明:

root.quit() 上記の行は、コマンドが実行された場合でもバックグラウンドで実行されるroot.mainloop()ieをバイパスするだけです。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
于 2021-01-14T03:38:07.923 に答える