【问题标题】:How to display a GTK-widget on top of FigureCanvas in matplotlib如何在 matplotlib 中的 FigureCanvas 上显示 GTK 小部件
【发布时间】:2013-10-10 09:23:01
【问题描述】:

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

【问题讨论】:

  • 为什么要将按钮放在画布上?旁边是合理的妥协吗?
  • 该图应该填满整个屏幕,我想在其顶部显示其他小部件作为临时覆盖,例如用于打开文件的 FileChooser。如果不可能,是的,我将不得不寻找替代方案。
  • 使用 GTK 3 和Gtk.Overlay

标签: python matplotlib gtk


【解决方案1】:

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

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

canvas.set_has_window(False)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2018-07-15
    • 2018-05-24
    • 1970-01-01
    相关资源
    最近更新 更多