Python Tkinterプログラムでウィンドウクローズイベント(ユーザーが「X」ボタンをクリック)を処理するにはどうすればよいですか?
9 に答える
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 は、閉じるボタンの 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ボタンです。
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