0

編集:すべての質問を1つの大きな質問にまとめました: https://stackoverflow.com/questions/12604139/need-tutorial-for-menubar-handling-panel-building

「もっと大きな」質問があります: 私は Python を初めて使用し、小さなプログラムを作成し始めました -> 「実行による学習」;) 私のプログラムは動作します (まだそれほど大きくはありません) が、コードはすでに少し混乱しています:その中には 1 つのクラスしかなく、相互に参照する非常に多くの関数があります。私の質問は次のとおりです。コードを構造化する方法のヒントを教えてもらえますか? もっとクラスを作成する必要があると思います...しかし、どこで?コードのどの部分を新しいクラスに結合する必要がありますか? 私のプログラムについての簡単な説明 (完了したら何をするか): これは一種のサッカー//フットボール マネージャー ゲームです。異なる属性を持つ 3 人のプレーヤーで構成されるチームを作成し、それらを指導 (属性を改善) し、他の (コンピューター) チームと対戦することができます。

# -*- coding: cp1252 -*-
import wx

class myclass(wx.Frame):

    def __init__(self,parent,id):
        self.title='Click Kick'
        bgcolour=(170,255,170)

        wx.Frame.__init__(self,parent,id,self.title,size=wx.DisplaySize())
        self.displayw=wx.DisplaySize()[0]
        self.displayh=wx.DisplaySize()[1]

        self.startpanel=wx.Panel(self,size=wx.DisplaySize())
        titlefont = wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, False, u'Consolas')
        self.SetBackgroundColour(bgcolour)
        self.dateinewgamepanel=wx.Panel(self,size=wx.DisplaySize())
        self.dateiloadgamepanel=wx.Panel(self,size=wx.DisplaySize())
        self.teamoverviewpanel=wx.Panel(self,size=wx.DisplaySize())
        self.trainingpanel=wx.Panel(self,size=wx.DisplaySize())
        self.spielpanel=wx.Panel(self,size=wx.DisplaySize())
        self.regelnpanel=wx.Panel(self,size=wx.DisplaySize())
        self.infopanel=wx.Panel(self,size=wx.DisplaySize())

        self.teamname=''

        ID_newgame=01
        ID_loadgame=02
        ID_overview=11
        ID_training=21
        ID_spiel=31
        ID_regeln=41
        ID_ueber=42
        #status=self.CreateStatusBar()
        menubar=wx.MenuBar()
        self.datei=wx.Menu()
        self.team=wx.Menu()
        self.training=wx.Menu()
        self.spiel=wx.Menu()
        self.info=wx.Menu()
        self.datei.Append(ID_newgame,"Neues Spiel")
        self.datei.Append(ID_loadgame,"Spiel laden...")
        self.team.Append(ID_overview,"Übersicht")
        self.training.Append(ID_training,"Trainieren")
        self.spiel.Append(ID_spiel,"Spielen")
        self.info.Append(ID_regeln,"Regeln")
        self.info.Append(ID_ueber,"Info")
        menubar.Append(self.datei,"Datei")
        menubar.Append(self.team,"Mannschaft")
        menubar.Append(self.training,"Training")
        menubar.Append(self.spiel,"Spiel")
        menubar.Append(self.info,"Info")
        self.SetMenuBar(menubar)

        self.titletext=wx.StaticText(self.startpanel, -1, self.title, (220,130))
        self.titletext.SetFont(titlefont)
        self.newgame = wx.Button(self.startpanel,label="Neues Spiel",pos=(215,160),size=(80,40))
        self.loadgame = wx.Button(self.startpanel,label="Spiel laden",pos=(305,160),size=(80,40))

        self.Bind(wx.EVT_BUTTON, self.dateinewgamepanelbuild, self.newgame)
        self.Bind(wx.EVT_BUTTON, self.dateiloadgamepanelbuild, self.loadgame)

        wx.EVT_MENU(self, ID_newgame, self.dateinewgamepanelbuild)
        wx.EVT_MENU(self, ID_loadgame, self.dateiloadgamepanelbuild)
        wx.EVT_MENU(self, ID_overview, self.teamoverviewpanelbuild)
        wx.EVT_MENU(self, ID_ueber, self.infopanelbuild)


    def hideallpanels(self):
        self.startpanel.Hide()
        self.dateinewgamepanel.Hide()
        self.dateiloadgamepanel.Hide()
        self.teamoverviewpanel.Hide()
        self.trainingpanel.Hide()
        self.spielpanel.Hide()

    def infopanelbuild(self,event):
        self.hideallpanels()
        self.infopanel.Show()
        wx.StaticText(self.infopanel,-1,"Autor: Steffen Becker")

    def dateinewgamepanelbuild(self,event):
        # panel neu zusammensetzen (mit aktuellen Werten), panel zeigen, alle anderen panels verstecken
        w=0
        h=-20
        self.hideallpanels()
        self.dateinewgamepanel.Show()
        #wx.StaticBitmap(self.dateinewgamepanel).SetBitmap(wx.Bitmap('pics/defaultplayer.bmp'))
        wx.StaticText(self.dateinewgamepanel, -1, "Neues Spiel", (5+w,25+h)).SetFont(wx.Font(16, wx.MODERN, wx.NORMAL, wx.BOLD))
        wx.StaticText(self.dateinewgamepanel, -1, "Teamname:", (self.displayw/4+10+w,self.displayh/10+20+h))
        self.teamnameinput = wx.TextCtrl(self.dateinewgamepanel, pos=(self.displayw/4+10+w,self.displayh/8+20+h), size=(280,22))

        wx.StaticText(self.dateinewgamepanel, -1, "Name 1. Spieler", (self.displayw/16+w,self.displayh/2+h))
        self.player1input = wx.TextCtrl(self.dateinewgamepanel, pos=(self.displayw/16+w,self.displayh/2+20+h), size=(130,20))
        wx.StaticText(self.dateinewgamepanel, -1, "Spielertyp", (self.displayw/16+w,self.displayh/2+60+h))
        self.player1typeinput = wx.Choice(self.dateinewgamepanel,id=-1,pos=(self.displayw/16+w,self.displayh/2+80+h))
        player1typelist = ['Dribbler', 'Spielgestalter', 'Balleroberer']
        self.player1typeinput.AppendItems(strings=player1typelist)
        self.player1typeinput.SetSelection(0)
        picplayer1=wx.Image("pics\defaultplayer.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()
        picbutplayer1=wx.BitmapButton(self.dateinewgamepanel,-1,picplayer1,pos=(self.displayw/16+w,self.displayh/2-140+h))

        wx.StaticText(self.dateinewgamepanel, -1, "Name 2. Spieler", (self.displayw*5/16+w,self.displayh/2+h))
        self.player2input = wx.TextCtrl(self.dateinewgamepanel, pos=(self.displayw*5/16+w,self.displayh/2+20+h), size=(130,20))
        wx.StaticText(self.dateinewgamepanel, -1, "Spielertyp", (self.displayw*5/16+w,self.displayh/2+60+h))
        self.player2typeinput = wx.Choice(self.dateinewgamepanel,id=-1,pos=(self.displayw*5/16+w,self.displayh/2+80+h))
        player2typelist = ['Dribbler', 'Spielgestalter', 'Balleroberer']
        self.player2typeinput.AppendItems(strings=player2typelist)
        self.player2typeinput.SetSelection(0)
        picplayer2=wx.Image("pics\defaultplayer.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()
        picbutplayer2=wx.BitmapButton(self.dateinewgamepanel,-1,picplayer2,pos=(self.displayw*5/16+w,self.displayh/2-140+h))

        wx.StaticText(self.dateinewgamepanel, -1, "Name 3. Spieler", (self.displayw*9/16+w,self.displayh/2+h))
        self.player3input = wx.TextCtrl(self.dateinewgamepanel, pos=(self.displayw*9/16+w,self.displayh/2+20+h), size=(130,20))
        wx.StaticText(self.dateinewgamepanel, -1, "Spielertyp", (self.displayw*9/16+w,self.displayh/2+60+h))
        self.player3typeinput = wx.Choice(self.dateinewgamepanel,id=-1,pos=(self.displayw*9/16+w,self.displayh/2+80+h))
        player3typelist = ['Dribbler', 'Spielgestalter', 'Balleroberer']
        self.player3typeinput.AppendItems(strings=player3typelist)
        self.player3typeinput.SetSelection(0)
        picplayer3=wx.Image("pics\defaultplayer.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()
        picbutplayer3=wx.BitmapButton(self.dateinewgamepanel,-1,picplayer3,pos=(self.displayw*9/16+w,self.displayh/2-140+h))


        #bmp = wx.Image('pics/defaultplayer.bmp', wx.BITMAP_TYPE_BMP).ConvertToBitmap()
        #wx.StaticBitmap(self.dateinewgamepanel, -1, bmp, (1100, 500))

        self.playerok = wx.Button(self.dateinewgamepanel,label="Team erstellen",pos=(self.displayw*5/16-20+w,self.displayh/2+170+h),size=(170,30))
        self.Bind(wx.EVT_BUTTON, self.onteamok, self.playerok)
        self.teamnameerror=wx.StaticText(self.dateinewgamepanel, -1, "Gib bitte überall einen Namen ein!", (self.displayw*5/16-15+w,self.displayh/2+210+h))
        self.teamnameerror.Hide()

    def dateiloadgamepanelbuild(self,event):
        self.hideallpanels()
        self.dateiloadgamepanel.Show()        
        wx.StaticText(self.dateiloadgamepanel, -1, "Noch nicht implementiert", (20,70))

    def teamoverviewpanelbuild(self,event):
        self.hideallpanels()
        self.teamoverviewpanel.Show()        
        wx.StaticText(self.teamoverviewpanel, -1, self.teamname, (120,10))
        wx.StaticText(self.teamoverviewpanel, -1, self.player1, (40,40))
        wx.StaticText(self.teamoverviewpanel, -1, self.player2, (120,40))
        wx.StaticText(self.teamoverviewpanel, -1, self.player3, (200,40))


    def onteamok(self,event):
        if self.teamnameinput.GetValue() == '' or self.player1input.GetValue() == '' or self.player2input.GetValue() == '' or self.player3input.GetValue() == '':
            self.teamnameerror.Show()
        else:
            self.teamname = self.teamnameinput.GetValue()
            self.player1 = self.player1input.GetValue()
            self.player2 = self.player2input.GetValue()
            self.player3 = self.player3input.GetValue()
            self.teamoverviewpanelbuild(event)

    def onloadgame(self,event):
        self.startpanel.Hide()
        self.dateinewgamepanel.Hide()
        self.dateiloadgamepanel.Show()





if __name__=='__main__':
    app=wx.PySimpleApp()
    frame=myclass(parent=None,id=-1)
    frame.Show()
    app.MainLoop()
4

1 に答える 1

2

ここに私の提案があります:

  • からクラスを派生させることはすでによく知っていますwx.Framewx.Panelプレイヤーのデータを取得するために同じことを行い、必要に応じてパラメーター化できます。これにより、コードの重複がなくなり、より便利になります。

    class PlayerPanel(wx.Panel):
        def __init__(self, name, *args, **kwargs):
            wx.Panel.__init__(self, *args, **kwargs)
            wx.StaticText(self, -1, name)
            ..etc...
    
  • wx.Frameゲームの作成と実際のプレイの側面から別のクラスを派生させて分離します。パネルの非表示/表示を取り除きます。

  • レイアウト管理について学びます。あなたのコードに慣れたいとき、ウィジェットの位置の絶対計算は受け入れられません。Zetcodeには非常に優れた例があります。

  • すべてのゲーム ロジックを個別のモジュールにリファクタリングします。このモジュールには、MVC (モデル ビュー コントローラー) パターンのモデル クラスとコントロール クラスを含めることができます。ビューは wxPython で書かれており、ゲーム ロジックは別のクラスにあり、モデルはたとえばプレイヤーの別のクラス (名前、年齢など) です。

  • wx.MessageBoxエラー メッセージと about ダイアログに を使用します。

于 2012-09-24T18:39:02.887 に答える