Я пытался создать графический интерфейс в 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