wxPython отображает случайное изображение из массива изображений с использованием шаблона MVC

#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()