クラスとオブジェクトを使用して Tkinter GUI を作成してみます。
今回は、インストール不要、設定不要の「Replit(https://replit.com/)」を用いて作成します。
「Replit」にログインすると、「Create Project」をクリック。クリックすると、「Create a Project」ウインドウが表示。表示後、ウインドウ内の「Template」で「tKinter」と検索すると、「TKinter」のテンプレートが使えます。選択後、「Create Project」ボタンをクリックで、プロジェクトが作成されます。
■コード
'''
import tkinter as tk
class MyGUI:
def __init__(self, master):
self.master = master
master.title("My GUI")
self.label = tk.Label(master, text="This is a label")
self.label.pack()
self.button = tk.Button(master,
text="Click me!",
command=self.do_something)
self.button.pack()
def do_something(self):
print("Button was clicked!")
root = tk.Tk()
my_gui = MyGUI(root)
tk.mainloop()
'''
importでtkinterを呼び出します。その後、asでtkとして呼び出します。
呼び出した後に、MyGUIというclassを定義します。定義後、クラス内にdef文を用いて__init__を記述し、コンストラクタを呼び出せるようにします。括弧内には、クラス内のメソッドで渡される最初の引数,パラメータは、オブジェクト自体でなければならないため、「self(自己)」と記述し、第1の引数として渡します。第2の引数,パラメータとして、masterを設定し、渡します。「self.master = master 」と記述し、引数,パラメータとして受け取った値であるmasterをインスタンス変数でmasterへ代入することにより、インスタンス作成時の初期処理として定義されるようにします。定義されるようになったので、「master.title("My GUI")」と記述すると、インスタンス作成時の初期処理としてGUIのタイトルとして表示されます。
その後、「self.label = tk.Label(master, text="This is a label")」、「self.button = tk.Button(master, text="Click me!", command=self.do_something)」を記述し、ラベルとボタンを作成します。それぞれ(ラベルとボタン)の括弧内には第1の引数,パラメータはmasterとすることで、MyGUI というクラスとして定義され設定できるようになります。
次にdef文を用いてdo_somethingという関数を定義します。括弧内には、クラス内のメソッドで渡される最初の引数,パラメータは、オブジェクト自体でなければならないため、「self(自己)」と記述し、第1の引数として渡します。この関数が呼び出されたときに実行される処理として、print()で文字列を出力させます。なお、do_somethingという関数は、作成されたボタンとバインド(関連付け)されているので、ボタンをクリックするたびに関数が呼び出されます。
関数を定義後、「root = tk.Tk()」と記述しインスタンス化しウインドウを作ります。作った後に「my_gui = MyGUI()」でインスタンス化します。このときに括弧内に引数,パラメータとして、先ほどのTkインスタンスを渡します。これでオブジェクト(GUI)が作成された。
最後に、先ほどのTkインスタンスで mainloop()を用いて、GUI のイベント ループを開始する。イベントループを開始する理由は、GUIアプリの画面を表示したままの状態にすることです。
■実行・検証
スクリプトを実行してみると、OutputでGUIが出力され、出力されたGUI内の「Click me!」ボタンをクリック。クリックするとConsoleで定義したdo_somethingという関数が呼び出され処理が実行。実行後、「Button was clicked!」と出力されることを確認した。