将子窗口视觉保持在其父窗口上方

时间:2014-05-01 21:42:19

标签: wxpython

我有一个matplotlib图(一个FigureCanvasWxAgg对象),我想在画布上放置一个WX Button - HTML / CSS术语,按钮应该有一个更高的< em> z 索引。这个初始化

button = wx.Button(canvas, label='Some Button')
button.Raise()

直到图表重绘为止,然后按钮消失。此时我仍然可以单击按钮,调整窗口大小(调整画布大小)会使按钮再次可见。确保子窗口始终位于其父窗口之上的传统方法是什么?

1 个答案:

答案 0 :(得分:0)

backend file backend_wx.py中,您可以看到matplotlib直接绘制到窗口上,并覆盖您之前创建的按钮。您需要做的是将draw方法替换为在绘制图形后触发重绘按钮的方法:

fig = figure()
but = Button(fig.canvas, label="button")
original_draw = fig.canvas.draw
def draw(gc=None):
    original_draw(gc)
    but.SetLabel(but.GetLabel())
fig.canvas.draw = draw
plot([1],[1])

我使用but.SetLabel(but.GetLabel())强制重绘按钮。使用wx.PostEvent发送适当的绘画事件也应该有效。如果您有多个控件并且不想绘制所有控件,因为调整大小可以解决问题,您可以使用SendSizeEvent()来触发重绘。你必须添加一些机制来阻止无限循环,因为size事件处理程序再次调用draw

最佳解决方案可能是编写一个自己的matplotlib后端,它不会绘制到主窗口而是绘制到canvas子,这样GUI工具包就可以处理绘图顺序。但这也是最复杂的解决方案。该文档包含有关该主题的一些信息,您可能还会发现已经提到的backend_wx.py有用。

顺便说一句:如果按钮不需要位于画布顶部,您也可以通过gcf().canvas.toolbar将其添加到工具栏。