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

GTK嵌入matplotlib时如何设置窗口重绘背景色解决白色闪烁问题

问题原因

你遇到的白色闪烁来源于GTK的Gtk.DrawingArea控件默认重绘逻辑:每次重绘前控件会先将整个区域清空为白色,再等待matplotlib完成图表内容渲染,两者的时间差就会产生明显的白色闪烁,深色主题下对比度高所以格外突兀。

修复方案

只需要修改画布的默认背景填充逻辑,提前渲染和图表背景一致的颜色即可,这里提供两种可行方案:

方案1:重写draw信号回调(推荐)

在matplotlib渲染前先手动填充画布背景为Figure的背景色,适配性最高,无需额外修改样式。
修改后完整代码如下:

import gi
import cairo
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

from matplotlib.backends.backend_gtk3agg import (
    FigureCanvasGTK3Agg as FigureCanvas)
from matplotlib.figure import Figure
import numpy as np
import matplotlib.pyplot as plt

plt.style.use('dark_background')      # 启用深色样式放大闪烁效果

win = Gtk.Window()
win.connect("delete-event", Gtk.main_quit)
win.set_default_size(400, 300)
win.set_title("Embedding in GTK")

fig = Figure(figsize=(5, 4), dpi=100)
ax = fig.add_subplot()
t = np.arange(0.0, 3.0, 0.01)
s = np.sin(2*np.pi*t)
ax.plot(t, s)

sw = Gtk.ScrolledWindow()
win.add(sw)
# 滚动窗口边框位于滚动条和视口之外
sw.set_border_width(10)

canvas = FigureCanvas(fig)  # 属于Gtk.DrawingArea类型
canvas.set_size_request(800, 600)
sw.add(canvas)

# 新增修复代码开始
canvas.set_app_paintable(True)
fig_background = fig.get_facecolor()

def fill_background(widget, cr):
    cr.set_source_rgba(*fig_background)
    cr.paint()
    return False

canvas.connect("draw", fill_background)
# 新增修复代码结束

win.show_all()
Gtk.main()

方案2:通过GTK CSS设置背景

如果不想额外引入cairo依赖,也可以直接给画布控件设置CSS样式,固定背景色:

# 把这段代码加在创建canvas之后,show_all之前
css = Gtk.CssProvider()
bg_rgb = [int(v * 255) for v in fig.get_facecolor()[:3]]
css.load_from_data(f"""
DrawingArea {{
    background-color: rgb({bg_rgb[0]}, {bg_rgb[1]}, {bg_rgb[2]});
}}
""".encode())
canvas.get_style_context().add_provider(css, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

两种方案都可以完全解决重绘时的白色闪烁问题,调整窗口大小时背景会保持和图表一致的深色,仅图表内容部分会有正常的重绘过渡。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:15:08