Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wxpython 使子窗口在视觉上高于其父窗口_Wxpython - Fatal编程技术网

Wxpython 使子窗口在视觉上高于其父窗口

Wxpython 使子窗口在视觉上高于其父窗口,wxpython,Wxpython,我有一个matplotlib图(一个FigureCanvasWxAgg对象),我想在画布上放置一个WX按钮,用HTML/CSS术语表示,该按钮的z索引应该更高。此初始化 button = wx.Button(canvas, label='Some Button') button.Raise() 直到图形自身重新绘制,按钮消失为止。此时我仍然可以单击按钮,调整窗口大小(调整画布大小)使按钮再次可见。确保子窗口始终绘制在其父窗口上方的常规方法是什么 在中,您可以看到matplotlib直接绘制到窗

我有一个matplotlib图(一个
FigureCanvasWxAgg
对象),我想在画布上放置一个WX
按钮
,用HTML/CSS术语表示,该按钮的z索引应该更高。此初始化

button = wx.Button(canvas, label='Some Button')
button.Raise()
直到图形自身重新绘制,按钮消失为止。此时我仍然可以单击按钮,调整窗口大小(调整画布大小)使按钮再次可见。确保子窗口始终绘制在其父窗口上方的常规方法是什么

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

fig=图()
但是=按钮(图canvas,label=“Button”)
原始绘图=图画布绘图
def提取(gc=无):
原始图纸(gc)
but.SetLabel(but.GetLabel())
图canvas.draw=绘制
绘图([1],[1])
我使用
but.SetLabel(but.GetLabel())
强制重画按钮。使用
wx.PostEvent
发送适当的绘制事件也应该有效。如果您有多个控件,并且不想覆盖所有控件,因为调整大小可以解决问题,您可以使用
SendSizeEvent()
触发重画。您必须添加一些机制来防止无限循环,因为size事件处理程序再次调用
draw

最好的解决方案可能是编写自己的matplotlib后端,该后端不绘制到主窗口中,而是绘制到画布子窗口中,这样GUI工具包就可以处理绘制顺序。但这也是最复杂的解决方案。文档中有一些关于该主题的信息,您可能还会发现前面提到的
backend_wx.py
很有帮助

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