wx-fenster steuert soya-programm

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

wx-fenster steuert soya-programm

Beitragvon sechsrad » Sonntag 13. April 2008, 22:02

mit 5 button im wx-pyton-fenster kann das sich drehende objekt im soay3d-fenster ferngesteuert werden(rechts,links,hoch, runter,close):

Code: Alles auswählen

# -*- indent-tabs-mode: t -*-

import sys, os, os.path, soya, soya.widget, wx, time

#soya.init("test",640,480)
soya.init("test",320,240)

soya.path.append(os.path.join(os.path.dirname(sys.argv[0]), "data"))

scene = soya.World()
modell=soya.Model.get("caterpillar_head")

head = soya.Body(scene,modell )

light = soya.Light(scene)
light.set_xyz(2.0, 5.0, 0.0)

camera = soya.Camera(scene)
camera.set_xyz(0.0, 15.0, 15.0)
camera.look_at(head)

soya.set_root_widget(soya.widget.Group())
soya.root_widget.add(camera)
#soya.root_widget.add(soya.widget.FPSLabel())

soya.MainLoop(scene)

head.y=-15.0

class MyFrame(wx.Frame):
 
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title,pos=(15, 15), size=(150,300))

        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
        self.timer.Start(30)
        panel = wx.Panel(self)

        text = wx.StaticText(panel, -1,)
        text.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))
        btn = wx.Button(panel, -1, "Close")
        btn_h = wx.Button(panel, -1, "hoch")
        btn_r= wx.Button(panel, -1, "runter")
        btn_li = wx.Button(panel, -1, "links")
        btn_re= wx.Button(panel, -1, "rechts")
       
        self.Bind(wx.EVT_BUTTON, self.OnTimeToClose, btn)
        self.Bind(wx.EVT_BUTTON, self.hoch, btn_h)
        self.Bind(wx.EVT_BUTTON, self.runter, btn_r)
        self.Bind(wx.EVT_BUTTON, self.links, btn_li)
        self.Bind(wx.EVT_BUTTON, self.rechts, btn_re)
       
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(btn, 0, wx.ALL, 5) 
        sizer.Add(btn_h, 0, wx.ALL, 5)
        sizer.Add(btn_r, 0, wx.ALL, 5) 
        sizer.Add(btn_li, 0, wx.ALL, 5)
        sizer.Add(btn_re, 0, wx.ALL, 5) 
        panel.SetSizer(sizer)

    def OnTimeToClose(self, evt):
        self.Close()
 
    def OnTimer(self, evt):     
        head.rotate_x (2)
        soya.MAIN_LOOP.update()
       
    def hoch(self,evt):   
        head.y += 1
       
    def runter(self,evt):   
        head.y -= 1   
       
    def links(self,evt):   
        head.x -= 1   
       
    def rechts(self,evt):   
        head.x += 1   
       
class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, "wx-soya")
        self.SetTopWindow(frame)
        frame.Show(True)
        return True
       
app = MyApp(redirect=True)
app.MainLoop()
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Sonntag 13. April 2008, 23:11

Ich würde den ganzen oben Teil, welcher die Anwendung initialisiert, noch in eine eigene Klasse packen. Dann muss man nicht auf globalen Variablen rumarbeiten und packt sich nicht den Namensraum voll.

Auch das Erzeugen der Buttons schreit gerade zu nach einfer Vereinfachung:

Code: Alles auswählen

        text = wx.StaticText(panel, -1,) #Komma zu viel oder Parameter zu wenig?
        sizer = wx.BoxSizer(wx.VERTICAL)
        text.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))
       
        buttons = [("Close", self.OnTimeToClose),
                        ("hoch", self.hoch), ("runter", self.runter),
                        ("links", self.links), ("rechts", self.rechts)]
        for (name, action) in buttons:
            btn = wx.Button(panel, -1, name)
            self.Bin(wx.EVT_BUTTON, action, btn)
            sizer.Add(btn, 0, wx.ALL, 5)

        panel.SetSizer(sizer)


An Stelle der Methoden hoch, runter, links, rechts würde ich eine move-Methode einführen:

Code: Alles auswählen

def move(x=0, y=0):
    head.x += x
    head.y += y


Und dann noch die Actions anpassen. Anstelle von hoch zum Beispiel:

Code: Alles auswählen

("hoch", lambda s,e: move(y=1))
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Beitragvon sechsrad » Montag 14. April 2008, 12:06

jup, danke. klappt ganz gut mit dem tip.

nur das verstehe ich nicht :
("hoch", lambda s,e: move(y=1))

kannste für ein move mal ein beispiel posten?

mfg
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Montag 14. April 2008, 12:22

Die move-Methode habe ich oben ja bereits gegeben, diese ist nur eine Verallgemeinerung um sich in alle Richtungen bewegen zu können:

Code: Alles auswählen

def move(x=0, y=0):
    head.x += x
    head.y += y


Der Lambda-Ausdruck ruft nun lediglich die move-Funktion auf, welche die anderen Bewegungsfunktionen ersestzt. Am besten vielleicht in Form der konkreten Ersetzungen:

Code: Alles auswählen

#hoch: Bewegung auf y-Achse um +1
move(y=1) #entspricht deiner Methode "hoch"

#runter: Bewegung auf y-Achse um -1
move(y=-1) #entspricht deiner Methode "runter"

#links: Bewegung auf x-Achse um -1
move(x=-1) #entspricht deiner Methode "links"

#rechts: Bewegung auf x-Achse um +1
move(x=1) #entspricht deiner Methode "rechts"


Wenn du x und y nun konkret in die move-Methode einsetzt, siehst du, dass sie zu deinen Methoden äquivalent sind.

Jetzt must du in der Liste "buttons" lediglich immer noch die Action-Komponente der Tupel anpassen, also bspw. "self.runter" durch "lambda s,e: move(y=-1)" ersetzen. (Das "lambda" erzeugt dir eine anyonyme Funktion (Funktion ohne Namen).):

Code: Alles auswählen

buttons = [("Close", self.OnTimeToClose),
                ("hoch", lambda s,e: move(y=1)),
                ("runter", lambda s,e: move(y=-1)),
                ("links", lambda s,e: move(x=-1)),
                ("rechts", lambda s,e: move(x=1))]



Ich hoffe mal, dass ich deine Frage richtig verstanden habe :)
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Beitragvon sechsrad » Montag 14. April 2008, 13:33

jup, jetzt habe ich es kapiert.

mfg

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder