PySimpleGUI 实现更换主题

PySimpleGUI 实现更换主题,先上效果:

完整代码:

#!/usr/bin/env python
# coding=utf-8

"""
    作者:刮骨剑
    日期:2021-03-19
    描述:PySimpleGUI 颜色主题

    注:窗口加载完毕后,通过 sg.theme('theme_name') 方法直接应用主题是无法立即生效的,所以在这里构造了两种方式来应用主题:1、通过加载子窗口来生成预览;2、选择主题后保存到配置文件中,再重启程序自身,使下次加载窗口前能读取到上次已选择的主题并应用;
"""

import os, sys, time, random
import PySimpleGUI as sg
from configobj import ConfigObj

def restart_program():
    """重启程序"""
    # 获取 Python 解释器的路径
    python_path = sys.executable
    # 获取程序路径
    program_path = os.path.abspath(__file__)
    # 重启程序
    os.execl(python_path, program_path, *sys.argv)

cur_dir = os.path.dirname(os.path.abspath(__file__))

cfg_path = os.path.join(cur_dir, '颜色主题.ini')
cfg = ConfigObj(cfg_path, encoding='utf8')

# 获取主题列表
themes = sg.theme_list()

# 从配置文件中获取主题
if 'ColorTheme' in cfg:
    if 'theme' in cfg['ColorTheme']:
        theme = cfg['ColorTheme']['theme']
        # 应用主题
        sg.theme(theme)
else:
    cfg['ColorTheme'] = {}

# 定义布局
layout = [
    [sg.Text('请选择一个主题:')],
    [sg.Listbox(values=themes, size=(40, 12), key='listbox_theme_list', enable_events=True)],
    [sg.Text('已选择的主题:', size=(12, 1)), sg.Text('', size=(28, 1), key='text_theme_selected')],
    [sg.Text('当前主题:', size=(12, 1)), sg.Text(sg.theme(), size=(28, 1), key='text_theme_cur')],
    [
        sg.Button('应用已选择的主题', key='bt_apply_theme_selected'),
        sg.Button('随机更换主题', key='bt_change_theme_random'),
        sg.Button('退出', key='bt_exit')
    ]
]

# 创建窗口
window = sg.Window('主题浏览器', layout, font=('YaHei Consolas Hybrid', 15))

def theme_prev(theme):
    '''主题预览'''
    layout = [
        [sg.T(theme, size=(20, 2))],
        [sg.Button('退出', size=(20, 2), key='bt_exit')]
    ]
    win_prev = sg.Window('主题预览', layout, font=('YaHei Consolas Hybrid', 15), keep_on_top=True)
    event_prev, values_prev = win_prev.read()
    # print(event_prev, values_prev)
    while True:
        if event_prev in (sg.WIN_CLOSED, 'bt_exit'):
            break
    win_prev.close()

# 事件循环
while True:
    event, values = window.read()
    # print(event, values)
    if event == 'listbox_theme_list':
        theme_list = values['listbox_theme_list']
        theme = theme_list[0]
        # 更新已选择的主题
        window.Element('text_theme_selected').Update(value=theme)
        # 主题预览
        sg.theme(theme)
        theme_prev(theme)
    if event == 'bt_apply_theme_selected':
        theme_list = values['listbox_theme_list']
        if theme_list == []:
            sg.popup_error('未选择有效的主题!', no_titlebar=True)
        else:
            theme = theme_list[0]
            # 主题保存到配置文件
            cfg['ColorTheme']['theme'] = theme
            cfg.write()
            # 重启程序,以应用主题
            restart_program()
    if event == 'bt_change_theme_random':
        # 随机获取一个主题
        theme = random.choice(themes)
        # 主题保存到配置文件
        cfg['ColorTheme']['theme'] = theme
        cfg.write()
        # 重启程序,以应用主题
        restart_program()
    if event in (sg.WIN_CLOSED, 'bt_exit'):
        break

# 关闭窗口
window.close()

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值