TkinterでToplevelウィンドウにフォーカスを維持する方法(grab_setの使い方)
TkinterにおけるToplevelクラスは、メインウィンドウとは別に生成される子ウィンドウを作成するためのクラスです。Toplevelウィンドウを作成すると、メインウィンドウの上に重なって表示され、その中に定義したウィジェットも一緒に表示されます。
しかし、デフォルトの状態では、ユーザーがメインウィンドウや他のアプリケーションをクリックすると、Toplevelウィンドウからフォーカスが外れてしまいます。そこで活躍するのがgrab_set()メソッドです。このメソッドを使うことで、Toplevelウィンドウが常に他のすべてのウィンドウより手前に表示され、フォーカスを保持し続けることができます。
実装例
以下のコードでは、メインウィンドウ上のボタンをクリックするとポップアップウィンドウが開き、grab_set()によってフォーカスが固定される仕組みを実装しています。
# tkinterライブラリをインポート
from tkinter import *
# tkinterフレームのインスタンスを作成
win = Tk()
win.geometry("700x350")
def open_win():
top = Toplevel(win)
top.geometry("700x250")
Label(top, text="Hey Folks!", font=('Helvetica 14 bold')).pack()
# Toplevelウィンドウにフォーカスを固定
top.grab_set()
# 名前を表示するラベルを作成
label = Label(win, text="下のボタンをクリックしてポップアップを開いてください", font=('Helvetica 18 bold'))
label.pack(pady=30)
# ボタンを作成
button = Button(win, text="クリック", command=open_win, font=('Helvetica 14 bold'), foreground='OrangeRed3', background="white")
button.pack(pady=50)
win.mainloop()
実行結果
上記のコードを実行すると、ポップアップウィンドウを開くためのボタンが配置されたメインウィンドウが表示されます。

次に、ボタンをクリックしてポップアップウィンドウを開きます。

補足:grab_set()の動作について
grab_set()は「ローカルグラブ」と呼ばれる仕組みで、同一アプリケーション内のすべてのイベントをToplevelウィンドウに集中させます。これにより、メインウィンドウ側のボタンや入力欄は操作できなくなり、モーダルダイアログのような挙動を実現できます。
なお、グラブを解除したい場合はgrab_release()メソッドを使用します。また、Toplevelウィンドウを閉じると自動的にグラブも解放されるため、通常は明示的な解除処理は不要です。
-
Python Tkinterでルートウィンドウを非表示・破棄する2つの方法
Tkinterアプリケーションのテスト中に、デフォルトのウィンドウやフレームを一時的に隠したい、あるいは完全に閉じたいという場面に遭遇することがあります。Tkinterでは、withdraw()メソッドによる「非表示」と、destroy()メソッドによる「破棄」の2つのアプローチが用意されています。mainloop()とウィンドウのライフサイクルmainloop()は、外部イベントによってウィンドウが閉じられるまで、Tkinterアプリケーションを実行し続ける役割を担います。このメインループが動作している間、ウィンドウは画面上に表示され続けます。ウィンドウを完全に破棄(終了)したい場合は、de
-
tkinterでウィンドウを閉じる方法|destroy()メソッドの使い方を解説
tkinterを使えば、Pythonで手軽にGUIアプリケーションを作成できます。しかし、タイトルバー右上の×ボタン以外の方法でウィンドウやフレームを閉じたい場合、どのように実装すればよいか悩むこともあるでしょう。そのようなときに役立つのが、ウィンドウを破棄して閉じるための .destroy() メソッドです。tkinterの各ウィジェットや属性は互いに独立しているため、「ウィンドウを閉じる処理」を専用の関数として分離して定義できます。これにより、ボタンのクリックイベントからウィンドウを閉じる動作を自由に制御可能です。サンプルコード# ライブラリをインポート from tkinter impo