Позиционные аргументы при использовании кнопки события - PullRequest
0 голосов
/ 17 июня 2019

Я пытался создать графический интерфейс в wxpython, который отображает два графика на отдельных подпанелях вверху и одну панель на. дно с кнопками событий. Графики должны быть заполнены одним срезом трехмерного массива при нажатии тестового кнопки, а затем кнопки «вверх» и «вниз» могут использоваться для перемещения по срезами трехмерного массива

При нажатии тестовой кнопки она предоставляет позиционный аргумент относительно «img».

Я добавил 'img' в функцию события от нажатия кнопки, чтобы понять, почему она не переносится через

import wx
import matplotlib
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure
import numpy as np

img_start = np.ones((128,128))
data = np.random.randint(low = 0, high = 255, size =(128, 128, 100))

###############################################################################
class SubPanel(wx.Panel):
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent=parent)
        self.SetBackgroundColour("red")

        self.figure = Figure()
        self.axes = self.figure.add_subplot(111)
        self.canvas = FigureCanvas(self, -1, self.figure)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.EXPAND)
        self.SetSizer(self.sizer)
        self.axes.set_xlabel("X")
        self.axes.set_ylabel("Y")
        self.draw()

    def draw(self): 
        self.axes.imshow(img_start)

    def changeImage(self, img):
        self.axes.imshow(img)
        self.canvas.draw()

###############################################################################
class TopPanel(wx.Panel):
    def __init__(self, parent, number, color, sub_panels):
        """Constructor"""
        wx.Panel.__init__(self, parent)
        self.SetBackgroundColour(color)

        label = "Panel-%s" % number
        lbl = wx.StaticText(self, label=label)

        v_sizer = wx.BoxSizer(wx.VERTICAL)
        v_sizer.Add(SubPanel(self), 0, wx.ALL|wx.EXPAND|wx.CENTER, 10)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(v_sizer, 0, wx.ALL, 5)
        sizer.Add(lbl, 0, wx.ALL|wx.CENTER, 5)
        self.SetSizer(sizer)

###############################################################################
class button_panel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        self.image = SubPanel
        self.slice_num = 1

        ''' Test Button '''
        self.test_btn = wx.Button(self, id=-1, label='Test', pos=(10,10))
        self.test_btn.Bind(wx.EVT_BUTTON, self.onViewTest)
        ''' Up Button '''
        self.up_btn = wx.Button(self, id=-1, label='Up', pos=(100,10))
        self.up_btn.Bind(wx.EVT_BUTTON, self.on_press_up)
        self.up_btn.Bind(wx.EVT_BUTTON, self.onViewTest)
        ''' Down Button '''
        self.down_btn = wx.Button(self, id=-1, label='Down', pos=(190,10))
        self.down_btn.Bind(wx.EVT_BUTTON, self.on_press_down)
        self.down_btn.Bind(wx.EVT_BUTTON, self.onViewTest)

    def onViewTest(self, event):
        img = data[:,:,self.slice_num]
        print(img)
        self.image.changeImage(img)
        event.Skip()

    def on_press_up(self, event):
        self.slice_num += 1
        event.Skip()

    def on_press_down(self, event):
        self.slice_num -= 1
        event.Skip()

###############################################################################
class MainPanel(wx.Panel):
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        hsizer = wx.BoxSizer(wx.HORIZONTAL)
        v_sizer = wx.BoxSizer(wx.VERTICAL)

        colors = [("white", 1),
                  ("white", 1)]
        count = 1
        for color, subpanel in colors:
            panel = TopPanel(self, count, color, subpanel)
            hsizer.Add(panel, 1, wx.EXPAND)
            count += 1

        bottom_panel = button_panel(self)
        v_sizer.Add(hsizer, 1, wx.EXPAND)
        v_sizer.Add(bottom_panel, 1, wx.EXPAND)

        self.SetSizer(v_sizer)

###############################################################################
class MainFrame(wx.Frame):
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Panels!", size=(600,500))
        panel = MainPanel(self)
        self.Show()

###############################################################################
if __name__ == "__main__":
    app = wx.App(False)
    frame = MainFrame()
    frame.Show()
    app.MainLoop()
del app
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...