CustomTkinterのチュートリアル触ってみた
CustomTkinterとは?
なんか詳細は分からないけど、tkinterより見た目がかっこよく作れる!という認識。
まずはチュートリアルを触ってみる。
準備
まずはモジュールのインストールから
pip install customtkinter
チュートリアルはビギナーとアドバイスの2種類公開されていたのでアドバイスの方をやってみます。
ビギナーはオブジェクト指向的な考え方がいらないものでアドバンスはオブジェクト指向的な考え方を使います。
アドバンスはそこまで高度ではなさそうだったのでアドバンスです。
作るもの
こんなやつを作る
マイナスボタンとプラスボタンのクリックで数字を加減する
ソースコードは公式ドキュメントのチュートリアルを参照
ソースコード解説
全体的に
typing
は型ヒントに使います。なんか便利な奴と思ってもらえばOKです。
import customtkinter
が今回使うライブラリのインポートです
また、作成するアプリはクラスで扱います。クラス名はアプリ名とかでもいいかもしれません。サンプルはそうしてましたw
またそのクラスにcustomtkinter.CTkFrame
を継承します。
継承のイメージはcustomtkinterの機能をくっつけるよみたいなイメージで大丈夫です。正確にはオブジェクト指向的な考え方を学んだほうが早いかも・・・・
from typing import Union, Callable
import customtkinter
class FloatSpinbox(customtkinter.CTkFrame):
クラスの処理
パーツの設定
アプリ自体の設定
def __init__()
でアプリの大きさなどの設定をします。
引数のwidth
とheight
でアプリ画面の大きさを指定します。そのほかの引数はそこまで気にしなくても今のところ大丈夫です。
def __init__(self, *args,
width: int = 100,
height: int = 32,
step_size: Union[int, float] = 1,
command: Callable = None,
**kwargs):
その他細かい設定をここでしています
self.configure(fg_color=("gray78", "gray28"))
self.grid_columnconfigure((0, 2), weight=0)
self.grid_columnconfigure(1, weight=1)
パーツの設定
ボタンの設定
customtkinter.CTkButton()
でボタンのオブジェクトを生成します。
第一引数のself
はボタンを設置するパーツと思ってください。ここでのselfはアプリの画面自体を指します。
text
はボタンに表示させる文字列を指定します。
width
とheight
はボタンの大きさを指定します。
command
はボタンをクリックしたときに実行する処理を指定します。今回はself.subtract_button_callback()
関数を指定しています。
ボタンパーツの設定が完了したらそれをフレーム(アプリの画面)に設置する必要があります。設置方法は座標で直接指定する方法もあるみたいですが、チュートリアルではグリット(.grid
)を使って設置設定を行います。
padx=(3, 0), pady=3
は設置するパーツ間隔を設定してます。
self.subtract_button = customtkinter.CTkButton(self, text="-", width=height - 6, height=height - 6,command=self.subtract_button_callback)
self.subtract_button.grid(row=0, column=0, padx=(3, 0), pady=3)
このように他のパーツも追加していきます。
以下の部分はテキストボックスを設置しているコードです。
self.entry = customtkinter.CTkEntry(self, width=width - (2 * height), height=height - 6, border_width=0)
self.entry.grid(row=0, column=1, columnspan=1, padx=3, pady=3, sticky="ew")
HTMLとかはテキストボックスというみたいですが、今回のcustomtkinterではentryと呼ぶらしい・・・
設置設定のsticky="ew"
は文字の配置を指定しています。東西南北を英語にしてその頭文字を取ってます。
また、テキストボックス(entry)は初期化を行う。初期化というより正確にはテキストボックスに値を代入している。第一引数で最初の何文字目に入れるかを指定して第二引数で実際に挿入する値を指定する。
self.entry.insert(0, "0.0")
クリック時の処理関数
加算も減算も処理に大きな差は無かったので減算部分の関数を解説します。
def subtract_button_callback(self):
if self.command is not None:
self.command()
try:
value = float(self.entry.get()) - self.step_size
self.entry.delete(0, "end")
self.entry.insert(0, value)
except ValueError:
return
最初のif self.command is not None:
はそこまで現段階で気にしなくても大丈夫です。
単純にself.command
がNoneじゃなかったらself.command
をNoneにするだけです。
これ以降がメインです。
処理内容は
- 現在のテキストボックス内の値を取得(
self.entry.get()
)して小数に変換、変換したものから設定した値を減算する - テキストボックス内のインデックス0~ラストまでを削除(
self.entry.delete(0, "end")
) - 新規に計算した結果を挿入する(
self.entry.insert(0, value)
)
処理はtry
とexcept
を使って例外処理も行います。
テキストボックスの値を取得する
def get(self) -> Union[float, None]:
try:
return float(self.entry.get())
except ValueError:
return None
テキストボックスに値を挿入する
def set(self, value: float):
self.entry.delete(0, "end")
self.entry.insert(0, str(float(value)))
メイン処理
該当コード
app = customtkinter.CTk()
spinbox_1 = FloatSpinbox(app, width=150, step_size=3)
spinbox_1.pack(padx=20, pady=20)
spinbox_1.set(35)
print(spinbox_1.get())
app.mainloop()
- アプリの本体を作る
app = customtkinter.CTk()
- アプリ画面にくっつけるパーツを作る
FloatSpinbox
クラスをインスタンス化して横幅とstep_size
で加減量を設定
spinbox_1.pack(padx=20, pady=20)
でアプリ本体にパーツの設置を行う
spinbox_1 = FloatSpinbox(app, width=150, step_size=3)
spinbox_1.pack(padx=20, pady=20)
- テキストボックスの初期値を設定&初期値をコンソールに表示
今回は初期値35で設定されています。
spinbox_1.set(35)
print(spinbox_1.get())
- アプリの起動(表示)
app.mainloop()
まとめ
難しい
でも、なんとなくPythonの文法を分かってる人なら結構サクサク使えるかもしれない・・・・
Discussion