我有一个matplotlib图(一个FigureCanvasWxAgg
对象),我想在画布上放置一个WX Button
- HTML / CSS术语,按钮应该有一个更高的< em> z 索引。这个初始化
button = wx.Button(canvas, label='Some Button')
button.Raise()
直到图表重绘为止,然后按钮消失。此时我仍然可以单击按钮,调整窗口大小(调整画布大小)会使按钮再次可见。确保子窗口始终位于其父窗口之上的传统方法是什么?
答案 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
将其添加到工具栏。