【python】ttkbootstrapメータを表示

今回もttkbootstrapで作成した成果物を記録として残します。
今回作成したのはメータを表示するプログラムです。

コンボボックスでwindowのカラーを選択できるように修正致しました。

### 成果物
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/1787708e-98c2-94ce-0628-d8ce2fa14406.png)

ボタンを押下したら%が増加したり、減ったりします。
一番上のボタンには現在のパーセントが表示されます。

### ソースコード
```python
from tkinter import *
import ttkbootstrap as tb

root = tb.Window(themename= "morph") # カラーを決める事が出来る。
root.geometry('500x570')

def up():
    my_meter.step(10)

def down():
    my_meter.step(-10)

global counter
counter = 5
def clicker():
    global counter
    if counter <= 100:
        my_meter.configure(amountused= counter)
        counter += 5
        my_button.configure(text=f'現在-> {my_meter.amountusedvar.get()} %')

my_meter = tb.Meter(root, bootstyle="success",
        subtext="現在のパーセンテージ",
        interactive= True,
        textright="%",
        metertype="full",
        stripethickness=10,
        metersize=200,
        padding= 50,
        amountused=0,
        amounttotal=100,
        subtextstyle="dark")
my_meter.pack(pady=50)

my_button = tb.Button(root, text="現在-> ", command=clicker)
my_button.pack(pady=10)

my_button2 = tb.Button(root, text="up", command=up)
my_button2.pack(pady=10)

my_butto3 = tb.Button(root, text="down", command=down)
my_butto3.pack(pady=10)

root.mainloop()
```
### chatGPTによる修正とコード説明
上記のプログラムをchatGPTにレビューしてもらいました。
以下の二点を指摘され修正をしてくれました。

### 修正内容
1.  clicker()関数にカウンターの増加とリセットの処理を追加しました。
100を超えたらカウンターを0にリセットします。

2. my_meterの初期値にcounterの値を設定しています。
これによって、100を超えてもカウンターがリセットされ、直感的な操作が可能になります。
また、メータをクリックして値を変更することができます。

3. windowのカラーを変更できるように修正致しました。

### コードの概要
1. ライブラリのインポート: 
Tkinterを始めとして、必要なライブラリがインポートされています。

2. ttkbootstrapのスタイルの初期化: 
ttkbootstrapはBootstrapテーマを使用したTkinterの拡張ライブラリで、スタイルを初期化しています。

3. メーターの設定: 
メーター(Meter)といわれるコンポーネントを設定します。
このメーターは、進捗状況をパーセンテージで表示するためのもので、
upボタンとdownボタンを使用してパーセンテージを増減させることができます。また、テーマに応じてメーターの色も変化します。

4. テーマコンボボックスの設定: 
テーマを変更するためのコンボボックスを設定します。
テーマとは、GUIのウィンドウの色やデザインを指定するもので、ユーザーはコンボボックスから選択することでテーマを変更できます。
コードはmain()関数でメーターの設定とテーマコンボボックスの設定を行い、root.mainloop()でTkinterのメインループを開始してGUIアプリケーションが起動します。


<strong>修正したコードは以下になります。</strong>
```python
from tkinter import *
import ttkbootstrap as tb
from ttkbootstrap import Style, Meter, Button, Label
import tkinter as tk

# ttkbootstrapのスタイルを初期化
root = tk.Tk()
root.geometry("500x570")
root.title("windowの色を選択")
style = Style(theme='flatly')

def meters_set():
    def up():
        my_meter.step(10)

    def down():
        my_meter.step(-10)

    global counter
    counter = 5
    def clicker():
        global counter
        counter += 5
        if counter > 100:
            counter = 0
        my_meter.configure(amountused=counter)
        my_button.configure(text=f'現在-> {my_meter.amountusedvar.get()} %')

    my_meter = Meter(bootstyle="success",
            subtext="現在のパーセンテージ",
            interactive= True,
            textright="%",
            metertype="full",
            stripethickness=10,
            metersize=200,
            padding= 50,
            amountused=0,
            amounttotal=100,
            subtextstyle="dark")
    my_meter.pack(pady=50)

    my_button = Button(text="現在-> ", command=clicker)
    my_button.pack(pady=10)

    my_button2 = Button(text="up", command=up)
    my_button2.pack(pady=10)

    my_butto3 = Button(text="down", command=down)
    my_butto3.pack(pady=10)

    window_label = Label(text="windowの色light", bootstyle="inverse success")
    window_label.place(x=220, y= 35)
    window_label = Label(text="windowの色dark", bootstyle="inverse success")
    window_label.place(x=220, y= 70)

def conbo_set():
    # テーマを変更する関数
    def change_theme(event):
        global style
        theme = combo_var.get()
        style = Style(theme=theme)
    # テーマを変更する関数
    def change_theme_2(event):
        global style
        theme = combo_var_1.get()
        style = Style(theme=theme)
    # テーマコンボボックスを作成
    themes = ['cosmo', 'flatly', 'journal', 'litera', 'lumen', 'minty', 'pulse', 'sandstone', 'united', 'yeti',
            'morph', 'simplex', 'cerculean']
    combo_var =tb.StringVar()
    combo = tb.Combobox(values=themes, textvariable=combo_var)
    combo.set("Windowの色を選択")
    combo.place(x=330, y=30)
    combo.bind("<<ComboboxSelected>>", change_theme)  # コンボボックスの選択イベントにchange_theme関数をバインド
    
    themes_1 = ['solar', 'superhero', 'darkly', 'cyborg', 'vapor']
    combo_var_1 =tb.StringVar()
    combo_1 = tb.Combobox(values=themes_1, textvariable=combo_var_1)
    combo_1.set("Windowの色を選択")
    combo_1.place(x=330, y=60)
    combo_1.bind("<<ComboboxSelected>>", change_theme_2)  # コンボボックスの選択イベントにchange_theme関数をバインド
def main():
    meters_set()
    conbo_set()

if __name__ == '__main__':
    main()
    root.mainloop()
```
以上になります。