PythonのTkinterでコードを書いていると、複数のウィンドウを作ってそれらの間で画面遷移を実装したくなる。
ある程度のまとまりを持ったコードになってくると1つのウィンドウだけでは足りず、2つ目のウィンドウが必要になってくるからだ。
これを解決しようとして僕が最初に考えたのが、2つのGUIクラスを作ってそれぞれのクラスの間を遷移させること。
例えば、AクラスとBクラスがあったとして、Aのなかでボタンがクリックされたら、Bの画面を表示する。
A➡︎Bだけの画面遷移、であればこのやり方で問題ない。
しかし、A➡︎B、B➡︎AというようにAとBの間を行ったり来たりする画面遷移にしたい場合には問題が発生する。
Aの中でBをimportし、Bの中でAをimportしなければならないからだ。
このようなコードを実装するとエラーが生じる。
それではどうすれば良いのだろうか?
試しにボタンを押すと別のウィンドウを生成するアプリを作ってみた。

このアプリでは、上の画面のボタンを押すと下の大きめのウィンドウが生成される。
そして2つの画面間はいつでも移動できる。
コードは至ってシンプルだ。
import tkinter as tk class MainWindow(): counter = 0 def __init__(self): self.root = tk.Tk() self.root.title("Test") button = tk.Button(self.root, text="Create new window", command=self.create_window) button.pack(side="top") self.root.mainloop() def create_window(self): self.counter += 1 t = tk.Toplevel(self.root) t.wm_title("Create Window") l = tk.Label(t, text="This is window #%s" % self.counter) l.pack(side="top", fill="both", expand=True, padx=100, pady=100) if __name__ == "__main__": MainWindow()
TK()でウィンドウのベースを生成する。
通常TK()を呼ぶのは1つのアプリに対して1回だけが基本である。
そして、2つ目以降ののウィンドウを呼び出す時にはToplevel()を使う。
Toplevelを使えば、最初に作ったウィンドウの上に別のウィンドウを生成することができる。