📝

CustomTkinterの落とし穴

2024/06/14に公開

Pythonだけで洗練されたアプリケーションを作成したいと思ったことはありませんか?
その際に役立つのが「CustomTkinter」です。
しかし、CustomTkinterはTkinterと似た文法がある一方で、それが逆につまずきやすいポイントとなります。
そこで、私がつまずいたポイントを備忘録として残しますので、参考にしていただければ幸いです。

1. 進捗バー (CTkProgressBar)

まず、進捗バーでつまずいた点です。

Tkinterの進捗バーは以下のように、maximumで最大値を指定し、そこから増減します。

import tkinter.ttk as ttk
ttk.Progressbar(root,maximum=100,mode="determinate",variable=var)

しかし、CustomTkinterでは1が最大値となります。

以下にサンプルコードを示します。

import customtkinter as ctk

root = ctk.CTk()
root.geometry('500x300')

progressbar = ctk.CTkProgressBar(root, width=200, height=8)
progressbar.place(relx=0.5, rely=0.5, anchor='center')
progressbar.set(0)

def update_progress():
    progress_value = progressbar.get()
    if progress_value < 1:
        progress_value += 0.1
        progressbar.set(progress_value)
        if progress_value >= 1:
            button.configure(text="終了")
    else:
        progress_value = 0
        progressbar.set(progress_value)
        button.configure(text="増やす")

button = ctk.CTkButton(root, text="増やす", command=update_progress)
button.place(relx=0.5, rely=0.8, anchor='center')

root.mainloop()

このサンプルコードでは、ボタンを押すごとに0.1ずつ進捗バーが増えます。

2. ".config" が ".configure" に変更

前の章で示したサンプルコードにもあるように、Tkinterでは途中で文字や値を変えるときには「.config」を使用していましたが、CustomTkinterでは「.configure」に変更されています。

button.configure(text="増やす")

現時点では、.configと記述すると以下のエラーが発生します。

AttributeError: 'config' is not implemented for CTk widgets. For consistency, always use 'configure' instead.

このエラーは比較的発見しやすいと思います。

パッケージ化

ここで解説する内容は以下の公式ドキュメントに詳しく書かれています。
https://customtkinter.tomschimansky.com/documentation/packaging
CustomTkinterはpyファイルだけでなくjsonファイルなども含んでいるため、pyinstallerを通常通り使うだけではエラーが発生しやすくなります。そのため、以下のようなコマンドが推奨されています。

pyinstaller --noconfirm --onedir --windowed --add-data "<CustomTkinter Location>/customtkinter;customtkinter/"  "<Path to Python Script>"

まとめ

この記事では、PythonのGUIライブラリであるCustomTkinterの使用方法と、その際に私がつまずいたポイントについて解説しました。具体的には、進捗バーの最大値が1であること、また、設定を変更する際のメソッドが.configから.configureに変更されていることを指摘しました。さらに、CustomTkinterをパッケージ化する際の注意点についても触れました。これらの情報が、Pythonで洗練されたアプリケーションを作成する際の参考になれば幸いです。

Discussion