Skip to main content
 首页 » 编程设计

python之如何在 matplotlib 中的 FigureCanvas 顶部显示 GTK 小部件

2025年05月04日8kenshinobiy

我想在 matplotlib 图的顶部显示一个按钮(和其他 GTK 小部件)。但是,它始终显示在 FigureCanvas 下方。

这是一个最小的例子:

import gtk 
import matplotlib as mpl 
from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas 
 
win=gtk.Window() 
fixed=gtk.Fixed() 
win.add(fixed) 
 
fig=mpl.figure.Figure() 
canvas=FigureCanvas(fig) 
canvas.set_size_request(100,100) 
fixed.put(canvas,0,0) 
button=gtk.Button('test') 
fixed.put(button,80,80) 
button2=gtk.Button('test2') 
fixed.put(button2,0,0) 
 
win.show_all() 
gtk.main() 

我也曾尝试使用 button.window.raise_(​​) 更改 GDK 窗口的 z 顺序,但没有成功。

有什么办法可以解决这个问题吗?

编辑:
原来 gtk.Button 没有创建新的 GDK 窗口,而是重用了其父窗口,而 FigureCanvas 确实创建了一个新窗口。

因此,如果我将上面的 button2 放入 gtk.EventBox 中,按钮就会显示在 Canvas 上方。但是,它有一个丑陋的矩形边框。知道如何删除它吗?

请您参考如下方法:

我最近遇到了这个问题并得到了很好的解决方案。

在 canvas.set_size_request 方法后添加以下行。

canvas.set_has_window(假)

原因是默认的 FigureCanvas 对象有自己的窗口,这使得它单独绘制。这样它就不会遵循 gtk.Fixed 及其其他子项的相同处理顺序。 Here是gtk绘图模型的引用。

set_has_window 方法强制 Canvas 使用与其父窗口相同的窗口,以便 Canvas 必须遵循 gtk.Fixed 指定的规则。