如何在matplotlib中的FigureCanvas上显示GTK小部件

时间:2012-12-05 23:09:29

标签: python matplotlib gtk

我想在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,则按钮会显示在画布上方。但是,它有一个丑陋的矩形边框。知道怎么删除吗?

1 个答案:

答案 0 :(得分:0)

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

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

canvas.set_has_window(假)

原因是默认的FigureCanvas对象有自己的窗口,这使得它可以单独绘制。因此它不会遵循gtk.Fixed及其他子节点的相同处理顺序。 Here是gtk绘图模型的参考。

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