Как выровнять холст matplotlib с панелью wx в рамке wx - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь создать графический интерфейс, где слева есть matplotlib.backends.backend_wxagg.FigureCanvasWxAgg, а справа wx.Panel. Как правильно их выровнять в wx.Frame?

Код:

import wx
import matplotlib.figure
import matplotlib.backends.backend_wxagg

class gui:
    def __init__(self):
        self.app = wx.App()

        self.app.frame = wx.Frame(parent=None, title="GUI")
        self.app.frame.SetSize(1024, 768)
        self.app.frame.Centre()

        figure = matplotlib.figure.Figure()
        subplots = figure.subplots(nrows=2, ncols=2)
        subplots[0,0].set_title("Plot 1")
        subplots[0,1].set_title("Plot 2")
        subplots[1,0].set_title("Plot 3")
        subplots[1,1].set_title("Plot 4")
        self.app.frame.canvas = matplotlib.backends.backend_wxagg.FigureCanvasWxAgg(
                                parent=self.app.frame,
                                id=-1,
                                figure=figure)

        self.app.frame.panel = wx.Panel(parent=self.app.frame)

        self.app.frame.sizer = wx.FlexGridSizer(cols=2)
        self.app.frame.sizer.Add(self.app.frame.canvas, wx.SizerFlags().Left())
        self.app.frame.sizer.Add(self.app.frame.panel, wx.SizerFlags().Right())
        self.app.frame.SetSizer(self.app.frame.sizer)

        self.app.frame.Show()
        self.app.MainLoop()

Результаты:

Кажется, что matplotlib.backends.backend_wxagg.FigureCanvasWxAgg перекрывается с wx.Panel, а не выравнивается с ним.

1 Ответ

0 голосов
/ 21 октября 2019

Я нашел решение проблемы. Поскольку я впервые использовал Python и wxPython, я не знал, что ничего не появится, если я только создаю wx.panel, но не добавляю к нему ничего. Итак, я думал, что wx.panel прячется за фигурой, но на самом деле это просто пусто. После того, как я добавил несколько элементов на панель, все заработало как положено. Новый код:

class GUI:
    def __init__(self):
        app = wx.App()
        frame = wx.Frame(   parent=None,
                            title="GUI",
                            style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)
        frame.SetMinSize(wx.Size(1280, 720))
        frame.SetSize(frame.GetMinSize())
        frame.Centre()

        figure = matplotlib.figure.Figure()
        subplots = figure.subplots(nrows=2, ncols=2)
        subplots[0,0].set_title("Plot 1")
        subplots[0,1].set_title("Plot 2")
        subplots[1,0].set_title("Plot 3")
        subplots[1,1].set_title("Plot 4")
        frame.canvas = matplotlib.backends.backend_wxagg.FigureCanvasWxAgg(
                            parent=frame,
                            id=-1,
                            figure=figure)

        frame.panel = wx.Panel(parent=frame)
        plot_choices = ["Choice 1", "Choice 2"]
        frame.panel.plot1 = wx.RadioBox(parent=frame.panel,
                                        label="Plot 1",
                                        choices=plot_choices)
        frame.panel.plot2 = wx.RadioBox(parent=frame.panel,
                                        label="Plot 2",
                                        choices=plot_choices)
        frame.panel.plot3 = wx.RadioBox(parent=frame.panel,
                                        label="Plot 3",
                                        choices=plot_choices)
        frame.panel.plot4 = wx.RadioBox(parent=frame.panel,
                                        label="Plot 4",
                                        choices=plot_choices)
        frame.panel.zoom = wx.Slider(parent=frame.panel, style=wx.SL_LABELS)

        frame.panel.sizer = wx.BoxSizer(wx.VERTICAL)
        frame.panel.sizer.Add(frame.panel.plot1)
        frame.panel.sizer.Add(frame.panel.plot2)
        frame.panel.sizer.Add(frame.panel.plot3)
        frame.panel.sizer.Add(frame.panel.plot4)
        frame.panel.sizer.Add(frame.panel.zoom, flag=wx.EXPAND)
        frame.panel.SetSizer(frame.panel.sizer)

        frame.sizer = wx.FlexGridSizer(cols=2)
        frame.sizer.AddGrowableRow(idx=0)
        frame.sizer.AddGrowableCol(idx=0)
        frame.sizer.Add(window=frame.canvas, flag=wx.EXPAND)
        frame.sizer.Add(window=frame.panel, flag=wx.EXPAND)
        frame.SetSizer(frame.sizer)

        frame.Show()
        app.MainLoop()

Новый результат: введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...