gpt4 book ai didi

wxpython - 使子窗口在视觉上保持在其父窗口上方

转载 作者:行者123 更新时间:2023-12-02 19:11:53 24 4
gpt4 key购买 nike

我有一个 matplotlib 图形(一个 FigureCanvasWxAgg 对象),我想在 Canvas 顶部放置一个 WX Button - 在 HTML/CSS 术语中,按钮应具有更高的 z 索引。本次初始化

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

执行此操作,直到图形重新绘制自身,此时按钮消失。此时我仍然可以单击按钮,并且调整窗口大小(这会调整 Canvas 大小)使按钮再次可见。确保子窗口始终绘制在其父窗口之上的传统方法是什么?

最佳答案

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 很有帮助。

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

关于wxpython - 使子窗口在视觉上保持在其父窗口上方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23417153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com