我正在学习wxPython时学习MVC模式。我试图从一系列图像中显示一个随机图像,我不知道从哪里开始。我遗漏了数组部分,因为我不确定是否在模型或控制器中。我发现的任何教程都不能轻易解释我正在尝试做什么。最重要的部分是我想了解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()
答案 0 :(得分:0)
您的Model
实际上是一个图片列表,您正在操作的数据。
View
类不应该创建控制器类,控制器应该通过依赖注入注入到视图类。
event
参数来自wx框架,如果您的逻辑不需要它,请不要将其发送给控制器。
创建视图时,视图会向控制器调用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()