#python #model-view-controller #wxpython
#python #модель-представление-контроллер #wxpython
Вопрос:
Я пытаюсь изучить шаблон MVC во время изучения wxPython. Я пытаюсь отобразить случайное изображение из массива изображений, и я понятия не имею, куда идти отсюда. Я опустил часть массива, потому что я не уверен, входит ли это в модель или контроллер. Ни в одном из найденных мной руководств легко не объясняется, что я пытаюсь сделать. Наиболее важной частью этого является то, что я хочу понять, как работает MVC, используя этот пример.
#!/usr/bin/python3
# import statements
import wx
import random
# define GUI class
class ViewFrame(wx.Frame): # view
# default constructor
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, 'Display Random Image', size=(600, 400))
# create a new panel
panel=wx.Panel(self)
# create status bar
statusBar=self.CreateStatusBar()
# create an event handler object
self.eventHandler = EventHandler()
# TODO: create a location for a PNG file from the image[i] array
# create button
button = wx.Button(panel, id=wx.ID_ANY, label="Change Image")
button.Bind(wx.EVT_BUTTON, self.eventHandler.onButton)
# end __init__
# end ViewFrame class
#----------------------------------------------------------------------
# define event handler
class EventHandler(): # controller
self.action = Action()
# define a button action method
def onButton(self, event):
self.action.change()
# TODO: figure out how to take the random return value
# and display the image[i] to the view
#----------------------------------------------------------------------
class Action(): # model
def __init__(self, images = 5):
self.images = images
self.change()
def change(self):
self.value = random.randint(1, self.images)
return self.value
# end Action class
#---------------------------------------------------------------------
if __name__ == '__main__' :
app=wx.App()
frame=ViewFrame(parent=None, id=1)
frame.Show()
app.MainLoop()
Ответ №1:
Ваш Model
на самом деле представляет собой список изображений, данных, с которыми вы работаете. View
Класс не должен создавать класс controller, контроллер должен быть введен посредством внедрения зависимостей в класс view.
event
Параметр взят из wx framework, если вашей логике он не нужен, не отправляйте его контроллеру.
При создании представления представление вызывает setView
контроллер, поэтому контроллер может вызывать методы представления.
import wx
import random
# define GUI class
class ViewFrame(wx.Frame): # view
# default constructor
def __init__(self, parent, id, eventHandler):
wx.Frame.__init__(self, parent, id, 'Display Random Image', size=(600, 400))
# create a new panel
panel = wx.Panel(self)
# create status bar
statusBar = self.CreateStatusBar()
# create an event handler object
self.eventHandler = eventHandler
self.eventHandler.setView(self)
# TODO: create a location for a PNG file from the image[i] array
# create button
button = wx.Button(panel, id=wx.ID_ANY, label="Change Image")
button.Bind(wx.EVT_BUTTON, self.changeImageClick)
def changeImageClick(self, event):
self.eventHandler.changeImageClick()
def setImage(self, image_path):
#implement set image
pass
class EventHandler:
# self.action = Action() --> produces a NameError, self does not defined
def __init__(self, images, view=None):
self.images = images
self.view = view
# define a button action method
def changeImageClick(self): # button should be lowercase
random_image = random.choice(self.images)
self.view.setImage(random_image)
def setView(self, view):
self.view = view
if __name__ == '__main__':
app = wx.App()
images = ['image_one.png', 'image_two.png']
frame = ViewFrame(parent=None, id=1, eventHandler=EventHandler(images))
frame.Show()
app.MainLoop()