Python

[Tkinter] ボタンクリックで新規ウィンドウを表示させる方法!(Toplevel)

TkinterでGUIを作成する際に、

所定の処理を、別ウィンドウ上で行いたい
処理結果を別ウィンドウで表示させたい

といったようなことを思ったことはないでしょうか?

Tkinterには、新しいウィンドウを表示させるためのメソッドがありますので今回はそれを紹介していきたいと思います!

すらいむ管理人

ちなみに新規ウィンドウを表示させた際には、
親ウィンドウを操作できる状態を維持するのか
親ウィンドウが操作できないようにロックするのか
によって使い分けることができます!

新規ウィンドウを表示させる方法

では、新しくウィンドウを表示させる方法を紹介していきます。

Tkinterで新しくウィンドウを表示させるには、Toplevel() メソッドを使用します。

GUI上に新規ウィンドウを表示させるためのボタンウィジェットを配置してみます!

import tkinter as tk

def create_window(event):
    #新規ウィンドウを表示
    window2 = tk.Toplevel(root)

root = tk.Tk()
root.geometry("200x100")
button = tk.Button(root, text="Create new window")
button.bind("<Button-1>", create_window)
button.pack()
root.mainloop()

(実行結果)

このようなウィンドウが表示されたと思います。
ボタンをクリックしてウィンドウを複数表示させてみましょう!

ただし、ここで注意していただきたいのは Toplevel() メソッドを呼び出すだけでは親ウィジェットは操作できてしまう状態だということです。

親ウィンドウを操作不可にしたい場合

先ほど説明した方法では、親ウィジェットが操作できてしまいました。

そのため親ウィジェットが操作できないようにロックするためには、追加で .grab_set() メソッドを呼び出してあげる必要があります。

実際に、親ウィンドウを操作できないようにするプログラムは以下のようになります。

import tkinter as tk

def create_window(event):
    #新規ウィンドウを表示
    window2 = tk.Toplevel(root)
    #親ウィンドウを操作不可にする
    window2.grab_set()

root = tk.Tk()
root.geometry("200x100")
button = tk.Button(root, text="Create new window")
button.bind("<Button-1>", create_window)
button.pack()
root.mainloop()

(実行結果)

この場合だと、親ウィンドウが操作できなくなるのでボタンをクリックして新規ウィンドウを複数表示させることはできなくなってしまいます。。。

新規ウィンドウをアクティブにしたい方法

最後に、表示させた新規ウィンドウをアクティブな状態にする方法を紹介します!

新規ウィンドウをアクティブにするには、.focus_set() メソッドを使用します。

上記プログラムの crete_window() 関数.focus_set() メソッドを追加してみてください。そうすると新規ウィンドウがアクティブな状態で表示されたと思います!

def create_window(event):
    #新規ウィンドウを表示
    window2 = tk.Toplevel(root)
    #新規ウィンドウをアクティブにする
    window2.focus_set()

以上となります。
最後まで見ていただきありがとうございました!