tkinterのクラス化の例
ソースコードを、クラス構造に書き換える手順を、より細かく説明します。
ステップ 0: ソースコードの準備
まず、これから編集するソースコードを準備しましょう。
クラス構造のソース
import tkinter as tk
class App(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.pack() #selfがframeになる。
self.create_widgets()
def create_widgets(self):
self.n = 0
self.label =tk.Label(self, text="LABEL")
self.Button = tk.Button(self,text="Button",command=self.btn_pushed)
self.label.pack() #frameにlabelが追加される。
self.Button.pack()
def btn_pushed(self):
self.n += 1
# self.label.configure(text="button_pushed %d" % self.n)
self.label.configure(text="button_pushed {}".format(self.n))
#classの後に記入する
root = tk.Tk()
root.title("Tkinter Class1")
app = App(master=root)
root.geometry("200x100")
app.mainloop()
ソースコード
import tkinter as tk
# Main Window
root = tk.Tk()
root.title("Tkinter:Scale")
root.geometry("300x200")
# Define the scales
# スケール値を読み書きするIntVarオブジェクトの定義
red = tk.IntVar()
red.set(0)
blue = tk.IntVar()
blue.set(0)
green = tk.IntVar()
green.set(0)
# Change background color
# n: ツマミを動かした位置の文字列(不使用)
# スケール位置を示すIntVarオブジェクトred,green,blueで値を読み取り
# ラベルの背景色を設定する。
def change_color(n):
# color = '#%02x%02x%02x' % (red.get(), green.get(), blue.get())
color = '#{:02x}{:02x}{:02x}'.format(red.get(), green.get(), blue.get())
color_label.configure(bg=color)
# color_Label
color_label = tk.Label(root, text='COLOR', bg='#000')
color_label.pack(fill='both');
# label: ラベル色を設定
# orient: 'h' 水平に設定
# length: スケールの幅を300ピクセルに設定
# from_, to: スケールの範囲を0から255 に設定
# variable: スケール値を読み書きするIntVarオブジェクトを設定
# command: ツマミを動かしたときに呼び出される関数 change_color を設定
s1 = tk.Scale(root, label='red', orient='h', length=300,
from_=0, to=255, variable=red,
command=change_color)
s2 = tk.Scale(root, label='blue', orient='h', length=300,
from_=0, to=255, variable=blue,
command=change_color)
s3 = tk.Scale(root, label='green', orient='h', length=300,
from_=0, to=255, variable=green,
command=change_color)
# Layout and styling widged
s1.pack(fill='both')
s2.pack(fill='both')
s3.pack(fill='both')
# Main
root.mainloop()
ステップ 1: Appクラスの枠組みを作る
これから、ソースコードの内容を整理するための「Appクラス」を作ります。
まず、空のクラスの枠組みだけを作ります。
import tkinter as tk
class App(tk.Frame): # Appクラスの定義
def __init__(self, master=None): # 初期化メソッドの定義
super().__init__(master)
self.pack()
# ここにウィジェット定義を追加していく予定です
# ここに他のメソッドを追加していく予定です
ステップ 2: ウィジェットの定義部分を移動する
ソースコードの `# Define the scales` から `s3.pack(fill='both')` までの部分を、`App` クラスの `init` メソッド 内に移動します。
移動する際に、`self.` を各ウィジェット名の前に追加します。例えば `red = tk.IntVar()` は `self.red = tk.IntVar()` に、`color_label = tk.Label(...)` は `self.color_label = tk.Label(...)` のように変更します。
import tkinter as tk
class App(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.pack()
# Define the scales
# スケール値を読み書きするIntVarオブジェクトの定義
self.red = tk.IntVar()
self.red.set(0)
self.blue = tk.IntVar()
self.blue.set(0)
self.green = tk.IntVar()
self.green.set(0)
# --- 省略 ---
# Layout and styling widged
self.s1.pack(fill='both')
self.s2.pack(fill='both')
self.s3.pack(fill='both')
# --- 省略 ---
ステップ 3: change_color関数をメソッドに変更する
`change_color` 関数を `App` クラスのメソッドに変更します。
関数定義をクラス内に移動します。
第一引数に `self` を追加します。
関数内で使用されている変数 (`red`, `green`, `blue`, `color_label`) の前に `self.` を追加します。
import tkinter as tk
class App(tk.Frame):
# ... (ステップ 2 のコード)
def change_color(self, n):
color = '#{:02x}{:02x}{:02x}'.format(self.red.get(), self.green.get(), self.blue.get())
self.color_label.configure(bg=color)
# ... (ステップ 2 のコード)
ステップ 4: `command` の設定を修正する
`tk.Scale` の `command` に指定している `change_color` を、`self.change_color` に変更します。
# ...
self.s1 = tk.Scale(self, label='red', orient='h', length=300,
from_=0, to=255, variable=self.red,
command=self.change_color) #ここを変更
# ...
ステップ 5: Appクラスのインスタンス化
最後に、 `App` クラスのインスタンスを作成し、メインウィンドウに配置します。
import tkinter as tk
# ... (ステップ 1~4 の Appクラスの定義)
# Main Window
root = tk.Tk()
root.title("Tkinter:Scale")
root.geometry("300x200")
# Appクラスのインスタンスを作成
app = App(master=root)
# Main
root.mainloop()
これで、ソースコードがクラス構造に書き換えられました。
完成したソース
import tkinter as tk
class App(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.pack()
# Define the scales
self.red = tk.IntVar()
self.red.set(0)
self.blue = tk.IntVar()
self.blue.set(0)
self.green = tk.IntVar()
self.green.set(0)
# color_Label
self.color_label = tk.Label(self, text='COLOR', bg='#000')
self.color_label.pack(fill='both')
self.s1 = tk.Scale(self, label='red', orient='h', length=300,
from_=0, to=255, variable=self.red,
command=self.change_color)
self.s2 = tk.Scale(self, label='blue', orient='h', length=300,
from_=0, to=255, variable=self.blue,
command=self.change_color)
self.s3 = tk.Scale(self, label='green', orient='h', length=300,
from_=0, to=255, variable=self.green,
command=self.change_color)
self.s1.pack(fill='both')
self.s2.pack(fill='both')
self.s3.pack(fill='both')
# change_colorメソッド
def change_color(self, n):
color = '#{:02x}{:02x}{:02x}'.format(self.red.get(), self.green.get(), self.blue.get())
self.color_label.configure(bg=color)
# Main Window
root = tk.Tk()
root.title("Tkinter:Scale")
root.geometry("300x200")
app = App(master=root)
# Main
root.mainloop()
この記事が気に入ったらサポートをしてみませんか?