2016-10-23 17 views
0

wxPythonの学習中にMVCパターンを学習しようとしています。私は画像の配列からランダムな画像を表示しようとしていますが、ここからどこに行くのか分かりません。私はモデルやコントローラーに入っているかどうかわからないので、配列部分を除外しました。私が見つけたチュートリアルでは、私が何をしようとしているのかを簡単に説明することはできません。これの最も重要な部分は、この例を使用して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() 

答えて

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() 
関連する問題