Помещаем NavigationToolbar в другое окно / панель в виде рисунка

#python-3.x #matplotlib #wxpython #toolbar

#python-3.x #matplotlib #wxpython #панель инструментов

Вопрос:

Изначально я использую wxPython-4.0.4, Python 3.7.2 и matplotlib 3.0.3 в Windows 10. Вот моя проблема.

Я хотел бы иметь (большой) рисунок и 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:

Поскольку никто еще не ответил на мой пост, я хочу опубликовать возможный подход, который я только что нашел здесь.

В этом примере панель инструментов создана, но не реализована в пользовательском интерфейсе и скрыта через self.toolbar.Hide() . Затем доступ к функциональным возможностям панели инструментов осуществляется с помощью кнопок wx и атрибутов панелей инструментов: self.toolbar.zoom() . Таким образом, кнопки могут быть размещены где-то еще в окне и, возможно, даже в другом окне, хотя я не тестировал последнее.

Я надеюсь, что это хотя бы немного поможет другим, если никто не найдет лучшего решения.

Что касается wx._core.wxAssertionError , я до сих пор не знаю, как это решить. Особенно, поскольку эта ошибка появлялась почти каждый раз, когда я хотел опробовать какой-нибудь пример кода, который так или иначе создает панель инструментов. Иногда мой обходной путь в сообщении помогал, но в других случаях это не так.