You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在集成Matplotlib的PySimpleGUI项目中修改界面背景颜色?

问题原因

背景色不生效由三点共同导致:

  • 代码中未实际调用sg.theme()方法设置主题
  • 布局内sg.Column组件硬编码了背景色参数,覆盖全局主题配置
  • Matplotlib图表自带默认白色背景,未和PySimpleGUI主题适配

修改步骤

  1. 导入PySimpleGUI后立即添加主题设置语句,示例:
import PySimpleGUI as sg
sg.theme('DarkBlue') # 可替换为任意你需要的主题名,执行sg.theme_list()可查看所有内置主题
  1. 删除sg.Column参数中的background_color='#DAE0E6',或者修改为和主题匹配的色值
  2. 绘图部分添加代码适配Matplotlib背景、文字颜色,和PySimpleGUI主题保持一致
  3. 修正判断逻辑中的event is 'OK'为event == 'OK',避免字符串身份判断的潜在bug

修改后完整代码

import PySimpleGUI as sg 
import numpy as np
import tkinter 

import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk

# 新增:设置主题
sg.theme('DarkBlue')

def draw_figure(canvas, fig):
    if canvas.children:
        for child in canvas.winfo_children():
            child.destroy()
    figure_canvas_agg = FigureCanvasTkAgg(fig, master=canvas)
    figure_canvas_agg.draw()
    figure_canvas_agg.get_tk_widget().pack(side='right', fill='both', expand=1)


# ------------------------------- PySimpleGUI CODE

layout = [
    [sg.Text("Population size: "), sg.Input(key="-POPULATIONSIZE-")],
    [sg.Text("Duration: "), sg.Input(key="-DURATION-")],
    [sg.Text("R Number: "), sg.Input(key="-RNUMBER-")],
    [sg.Text("Starting Infections: "), sg.Input(key="-STARTINGINFECTIONS-")],
    [sg.B('OK'), sg.B('Exit')],
    [sg.Canvas(key='controls_cv')],
    [sg.T('Figure:')],
    [sg.Column(
        layout=[
            [sg.Canvas(key='fig_cv',
                       size=(400 * 2, 400)
                       )]
        ],
        # 删除了硬编码的背景色,跟随全局主题
        pad=(0, 0)
    )],
]

# 可选:窗口显式设置背景色为主题背景色,更稳妥
window = sg.Window('Virus Simulation', layout, background_color=sg.theme_background_color())

while True:
    event, values = window.read()
    print(event, values)
    if event in (sg.WIN_CLOSED, 'Exit'):
        break
    elif event == 'OK':
        # ------------------------------- PASTE YOUR MATPLOTLIB CODE HERE
        plt.figure(1)
        # 新增:清空之前的绘图,避免重复绘制
        plt.clf()
        fig = plt.gcf()
        # 新增:设置图表整体背景色匹配主题
        fig.patch.set_facecolor(sg.theme_background_color())
        DPI = fig.get_dpi()
        # ------------------------------- you have to play with this size to reduce the movement error when the mouse hovers over the figure, it's close to canvas size
        fig.set_size_inches(404 * 2 / float(DPI), 404 / float(DPI))
        # -------------------------------
        x = list(range(1, 100))
        y = list(range(1, 100))
        plt.plot(x, y, color="r")
        plt.title('Virus Infections Data')
        plt.xlabel('Time in Days')
        plt.ylabel('Infections')
        
        # 新增:适配坐标轴、文字、网格颜色匹配主题
        ax = plt.gca()
        ax.set_facecolor(sg.theme_background_color())
        ax.title.set_color(sg.theme_text_color())
        ax.xaxis.label.set_color(sg.theme_text_color())
        ax.yaxis.label.set_color(sg.theme_text_color())
        ax.tick_params(axis='x', colors=sg.theme_text_color())
        ax.tick_params(axis='y', colors=sg.theme_text_color())
        plt.grid(alpha=0.3, color=sg.theme_text_color())

        # ------------------------------- Instead of plt.show()
        draw_figure(window['fig_cv'].TKCanvas, fig,)


window.close()

如果需要自定义主题配色,可以调用sg.theme_add_new()方法创建自定义主题后再使用即可。

内容的提问来源于stack exchange,提问作者Sw123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:45:04