#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
, я до сих пор не знаю, как это решить. Особенно, поскольку эта ошибка появлялась почти каждый раз, когда я хотел опробовать какой-нибудь пример кода, который так или иначе создает панель инструментов. Иногда мой обходной путь в сообщении помогал, но в других случаях это не так.