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
相关产品推荐
相关产品推荐

