クラスとオブジェクトを使用して Tkinter GUI を作成する
クラスとオブジェクトを使用して 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!」と出力されることを確認した。
Pythonでクラスとオブジェクトを使用したコード
``` class Dog: # コンストラクタ def __init__(self, name, breed, age): self.name = name self.breed = breed self.age = age def bark(self): print("ワンワン!") dog1 = Dog("桃", "ゴールデンレトリバー", 3) dog2 = Dog("太郎君", "秋田犬", 5) print(dog1.name) print(dog2.breed) dog1.bark() dog2.bark() ```
■GoogleColaboratory(Python 3.9.16、2023年3月20日)
今回は、Dogというクラスを定義。そして、クラス内にはコンストラクタと呼ばれる特殊なメソッドを定義します。コンストラクタのメソッド名は、__init__となります。__init__メソッドは、オブジェクトが作成された際に一度だけ呼び出されます。このメソッドを使用することで、オブジェクトに初期値を設定することができます。
コンストラクタと呼ばれる特殊なメソッドを定義後、括弧内には、クラス内のメソッドで渡される最初の引数,パラメータは、オブジェクト自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。その後、第2,第3,第4の引数,パラメータとして、name、breed、ageを設定します。そして、これら引数,パラメータを受け取り、self.**(name、breed、age)属性が初期化されます。また、Dogというクラスを使用してオブジェクトを作成すると、__init__メソッドが自動的に呼び出されます。
コンストラクタの引数,パラメータを設定した後は、def文を用いてbarkメソッドを定義します。そして先ほど同じように括弧内には、クラス内のメソッドで渡される最初の引数,パラメータは、オブジェクト自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出されたときに、print()を用いて文字列を出力させるという処理を実行します。
メソッドを定義後、dog1,dog2という変数を用意し、それぞれにDog()を格納し、インスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内に定義したメソッドにアクセスできるようになりました。その後、括弧内に、今回定義したクラス内の属性を操作するために、値を引数,パラメータとして渡します。
渡した後に、dog1のオブジェクトに対しては、ドット演算子( . )を用いnameの属性にアクセス。アクセス後、print()で属性の情報を出力します。次にdog2のオブジェクトに対しては、ドット演算子( . )を用いbreedの属性にアクセス。アクセス後、print()で属性の情報を出力します。
最後に、dog1,dog2というオブジェクトでドット演算子( . )を用い、bark()メソッドを呼び出します。
コード(セル)を記述し実行してみると、オブジェクトを作成し、属性の取得、メソッドを呼び出し処理の結果を出力できました。