![見出し画像](https://assets.st-note.com/production/uploads/images/141328390/rectangle_large_type_2_2c678bc534c4cfd6b1295e5164d3e468.jpeg?width=1200)
Tkinterでテーマの動的な切り替え+PySimpleGUI
(Python学習初心者の試行錯誤・備忘録です)
またまた「Copilotに聞いてみた」
![](https://assets.st-note.com/img/1716259749353-uOSsHNfDtj.png?width=1200)
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()
![](https://assets.st-note.com/img/1716259822109-D7peGzaDRj.png?width=1200)
検証
上のサンプルコードをそのまま実行します。
![](https://assets.st-note.com/img/1716259962229-CrEmtkSGti.png)
ボタンをクリックすると
![](https://assets.st-note.com/img/1716259986401-vgwlapFoSv.png)
このように、動的な切り替えができました。
今のところできていないこと
昨日は次のような内容を書いています。
PySimpleGUIの背後のTkinterにアクセスできることを確認しています。
今回の「Tkinterでテーマの動的な切り替え」ができたので、PySimpleGUIを使いながら、ttkthemesのテーマに切り替えるようなことができるんじゃないか?と考えていたのですが、またまたCopilotに聞いてみると
![](https://assets.st-note.com/img/1716334316642-wQGmKyLTXK.png?width=1200)
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')
# 以下にウィンドウのレイアウトとイベントループを追加
# ...
![](https://assets.st-note.com/img/1716334516246-3t32Amy7SM.png?width=1200)
だそうです。滅多に「できません」とは書かない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()
これで、次のようになりました。
![](https://assets.st-note.com/img/1716336677471-d30d8qrb3G.png)
(適用前はこうでした。)
![](https://assets.st-note.com/img/1716336613993-9DgE9RSy0K.png)
ただ「できません」とするだけでなく、代替策を示してくるところ「おぬしなかなかやりおるな」です。