如何在集成Matplotlib的PySimpleGUI项目中修改界面背景颜色?
问题原因
背景色不生效由三点共同导致:
- 代码中未实际调用
sg.theme()方法设置主题 - 布局内
sg.Column组件硬编码了背景色参数,覆盖全局主题配置 - Matplotlib图表自带默认白色背景,未和PySimpleGUI主题适配
修改步骤
- 导入PySimpleGUI后立即添加主题设置语句,示例:
import PySimpleGUI as sg sg.theme('DarkBlue') # 可替换为任意你需要的主题名,执行sg.theme_list()可查看所有内置主题
- 删除
sg.Column参数中的background_color='#DAE0E6',或者修改为和主题匹配的色值 - 绘图部分添加代码适配Matplotlib背景、文字颜色,和PySimpleGUI主题保持一致
- 修正判断逻辑中的
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
相关产品推荐
相关产品推荐

