将NavigationToolbar放置在不同的Window / Panel中,如图所示

时间:2019-03-18 15:33:51

标签: python-3.x matplotlib wxpython toolbar

首先,我在Windows 10上使用wxPython-4.0.4,Python 3.7.2和matplotlib 3.0.3。这是我的问题。

我想将一个(大)图形和NavigationToolbar嵌入到wxPython中。该图应可滚动,而工具栏应保持在原处。我的方法是将图形放置在可滚动面板(wx.lib.scrolledpanel.ScrolledPanel)中,然后将工具栏放在主面板顶部。这是我的代码如下:

import wx

locale = wx.Locale.GetSystemLanguage()  # fix to 'wx._core.wxAssertionError'

from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar
from wx.lib.scrolledpanel import ScrolledPanel


class Main_Panel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        ### Create Widgets
        self.plot_panel = ScrolledPanel(self)

        self.figure = Figure((10,10))               # creating figure and toolbar
        self.canvas = FigureCanvas(self.plot_panel, -1, self.figure)
        self.toolbar = NavigationToolbar(self.canvas)

        self.subplot = self.figure.add_subplot(111) # just some arbitrary plot
        self.subplot.plot([1,2,3], [2,4,1])

        ### Implement Widgets
        self.plot_sizer = wx.BoxSizer(wx.VERTICAL)  # sizer for scrollable plot panel
        self.plot_sizer.Add(self.toolbar)           # putting toolbar here does work but it is also scrolling
        self.plot_sizer.Add(self.canvas)
        self.plot_panel.SetSizer(self.plot_sizer)
        self.plot_panel.SetupScrolling()

        self.main_sizer = wx.BoxSizer(wx.VERTICAL)  # sizer for main panel
##        self.main_sizer.Add(self.toolbar)         # putting toolbar here does not work
        self.main_sizer.Add(self.plot_panel, proportion=1, flag=wx.EXPAND)
        self.SetSizer(self.main_sizer)


def main():
    app = wx.App()
    app.locale = wx.Locale(locale)  # fix to 'wx._core.wxAssertionError'

    frame = wx.Frame(None)
    Main_Panel(frame)
    frame.Show(True)
    app.MainLoop()

if __name__ == '__main__':
    main()

问题是我无法将图形和工具栏放置在两个不同的面板中。如果将它们放在相同的位置,则滚动时(显然),工具栏不会保留在屏幕上。但是,如果我尝试通过“ main_sizer”将其添加到“顶部”面板中,则它要么根本不显示,要么可以在“ ScrolledPanel”内部滚动,但无法正常工作。

我还尝试将带有“ ScrolledPanel”的整个零件放置到一个单独的类中,但是我也无法使工具栏正常工作。

有人对此有解决方案吗?甚至有可能吗?我是否必须甚至可以创建自己的工具栏?

此外,为什么我需要将两行放入代码中,并带有注释“ wx._core.wxAssertionError'的修复”,以便程序运行时不会出现上述错误?

感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

由于尚未有人回复我的帖子,因此我想发布一种我刚刚发现的here可能的方法。

在此示例中,工具栏已创建但未在UI中实现,并通过self.toolbar.Hide()隐藏。 然后,通过wx按钮和工具栏属性self.toolbar.zoom()访问工具栏的功能。这样,即使我没有测试过按钮,也可以将Buttons放置在窗口中的其他位置,甚至可能放置在另一个窗口中。

如果没有人提供更好的解决方案,我希望这至少会对其他人有所帮助。

对于wx._core.wxAssertionError,我仍然不知道如何解决。特别是,由于几乎每次我都想尝试一些示例代码以一种或多种方式创建工具栏时,都会出现此错误。有时我在帖子中的解决方法有所帮助,但其他时候却没有。