wxPython使用MVC模式显示图像数组中的随机图像

时间:2016-10-23 07:56:58

标签: python model-view-controller wxpython

我正在学习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()

1 个答案:

答案 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()