wie werden variable übergeben?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

hallo, wie werden variable übergeben?
diese routine wird immer aufgerufen mit einer variablen : def test(v)
von dieser timer-routine ( alle 30ms):
def OnTimer(self, evt):
test(v)
soya.MAIN_LOOP.update()

hier werden die variablen gesetzt :
def vorwaerts(self,evt):
v=0.5

def rueckwaerts(self,evt):
v=-0.5

aber v bleibt bei der übergabe immer "0".
finde den fehler nicht.

wenn ich statt v eine zahl einsetze, geht es :
def OnTimer(self, evt):
test(0.5)
soya.MAIN_LOOP.update()


noch etwas, wenn ich die variable in der timerroutine vorher mit "v" setze, geht es auch:
def OnTimer(self, evt):
v=0.5
test(v)
soya.MAIN_LOOP.update()

Code: Alles auswählen

v=0

def test(v): 
        wuerfel.speed = soya.Vector(wuerfel, 0.0, 0.0, v)   
        wuerfel.add_mul_vector(2, wuerfel.speed)
        
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,"") 
        sizer = wx.BoxSizer(wx.VERTICAL)
        text.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))
       
        buttons = [("Close", self.OnTimeToClose),
                        ("vorwaerts", self.vorwaerts), ("rueckwaerts", self.rueckwaerts), ("links", self.links), ("rechts", self.rechts)]
                        
        for (name, action) in buttons:
            btn = wx.Button(panel, -1, name)
            self.Bind(wx.EVT_BUTTON, action, btn)
            sizer.Add(btn, 0, wx.ALL, 5)

        panel.SetSizer(sizer)
        
    def OnTimeToClose(self, evt):
        self.Close()
  
    def OnTimer(self, evt):  
        test(v)
        soya.MAIN_LOOP.update() 
        
    def vorwaerts(self,evt): 
        v=0.5
        
    def rueckwaerts(self,evt): 
        v=-0.5
        
    def links(self,evt):    
        wuerfel.rotate_y(5.0)
        
    def rechts(self,evt):    
        wuerfel.rotate_y(-5.0)

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()
[/quote]
Zuletzt geändert von sechsrad am Samstag 26. April 2008, 19:48, insgesamt 1-mal geändert.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Der Fehler liegt um Grundlagenbereich:
Dir ist offensichtlich der Unterschied zwischen lokalen Variablen bzw. dem Namensraum einer Funktion und globalen Variablen bzw. Namensraum überhaupt nicht bewusst.

Ohne dieses Verständnis wirst du kein anständiges Programm schreiben können.

Lies mal im Tutorial.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

warum funktioniert diese routine innerhalb der class und springt an den richtigen ort mit der übergabe ausserhalb der class:

def OnTimer(self, evt):
v=0.5
test(v)
soya.MAIN_LOOP.update()



warum kann innerhalb einer class diese nicht durchgeführt werden ?

def rueckwaerts(self,evt):
v=-0.5


damit dieses durchgeführt werden kann .
def OnTimer(self, evt):
test(v)
soya.MAIN_LOOP.update()




das tut habe ich gelesen, aber ich verstehe daraus nicht, warum dieses nicht funktioniert mit dem wx-button in wx-win.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du musst ein "global v" vor die Zuweisungen schreiben (und wo es sonst noch in deiner Klasse vorkommt):

Code: Alles auswählen

def vorwaerts(self,evt):
        global v
        v=0.5
Jetzt, vergisst du aber sofort wieder das es "global" überhaupt gibt. Damit wird dein Programm vollkommen unwartbar. Ziehe das "v" doch mit in die Klasse hinein oder finde einen anderen Aufbau, welcher ohne "global"s auskommt.

Vielleicht solltest du dir noch mal kurz ein Tutorial über OOP anschauen und wie die Namespaces in Python aufgebaut sind. Und es wäre nett, wenn du auch die kurzen Codeausschnitte in code-Tags setzen würdest. So fett geschrieben sieht es nicht besonders übersichtlich aus.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

jup, danke mit dem hinweiss.

muss mal nachschauen, wie ich das in die class mit reinziehen kann.

mfg
Antworten