見出し画像

Tkinterでテーマの動的な切り替え+PySimpleGUI

(Python学習初心者の試行錯誤・備忘録です)
またまた「Copilotに聞いてみた」

import tkinter as tk
from tkinter import ttk
from ttkthemes import ThemedTk

def change_theme():
    # テーマを 'black' に変更
    root.set_theme('black')

# ThemedTk ウィンドウを作成
root = ThemedTk(theme="default")

# ボタンを作成し、テーマ変更関数をコマンドとして割り当て
theme_button = ttk.Button(root, text="Change to Black Theme", command=change_theme)
theme_button.pack(pady=20)

# メインループ
root.mainloop()

検証

上のサンプルコードをそのまま実行します。

ボタンをクリックすると

このように、動的な切り替えができました。

今のところできていないこと

昨日は次のような内容を書いています。

PySimpleGUIの背後のTkinterにアクセスできることを確認しています。
 今回の「Tkinterでテーマの動的な切り替え」ができたので、PySimpleGUIを使いながら、ttkthemesのテーマに切り替えるようなことができるんじゃないか?と考えていたのですが、またまたCopilotに聞いてみると

import PySimpleGUI as sg

# カスタムテーマのパラメータを設定
my_custom_theme = {
    'BACKGROUND': 'black',
    'TEXT': 'white',
    'INPUT': 'gray25',
    'TEXT_INPUT': 'white',
    'SCROLL': 'gray44',
    'BUTTON': ('white', 'black'),
    'PROGRESS': ('#01826B', '#D0D0D0'),
    'BORDER': 1,
    'SLIDER_DEPTH': 0,
    'PROGRESS_DEPTH': 0,
}

# カスタムテーマを適用
sg.theme_add_new('MyCustomTheme', my_custom_theme)
sg.theme('MyCustomTheme')

# 以下にウィンドウのレイアウトとイベントループを追加
# ...

だそうです。滅多に「できません」とは書かないCopilot先生が「できません」と書いているのだから、まあこれ以上深入りしない方が良さそう。

代替策

 Copilot先生が代替策を書いてくれているのでこれを試してみます。

import PySimpleGUI as eg

# カスタムテーマのパラメータを設定
my_custom_theme = {
    'BACKGROUND': 'black',
    'TEXT': 'white',
    'INPUT': 'gray25',
    'TEXT_INPUT': 'white',
    'SCROLL': 'gray44',
    'BUTTON': ('white', 'black'),
    'PROGRESS': ('#01826B', '#D0D0D0'),
    'BORDER': 1,
    'SLIDER_DEPTH': 0,
    'PROGRESS_DEPTH': 0,
}

# カスタムテーマを適用
eg.theme_add_new('MyCustomTheme', my_custom_theme)
eg.theme('MyCustomTheme')

# TkEasyGUIのウィンドウを作成
myfont = ('Arial', 30)
mysize = (14, 1)
layout = [[eg.Text("テキスト枠", font=myfont, size=mysize)],
          [eg.Button("ボタン", font=myfont)]]

window = eg.Window("テーマのテスト", layout=layout)

# ウィンドウの読み取りループ
while True:
    event, value = window.read()
    if event == eg.WIN_CLOSED or event == "Exit":  # 終わるとき
        break
window.close()

これで、次のようになりました。

(適用前はこうでした。)

ただ「できません」とするだけでなく、代替策を示してくるところ「おぬしなかなかやりおるな」です。

この記事が気に入ったらサポートをしてみませんか?