Seite 1 von 1

wie werden variable übergeben?

Verfasst: Samstag 26. April 2008, 19:21
von sechsrad
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]

Verfasst: Samstag 26. April 2008, 19:47
von numerix
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.

Verfasst: Samstag 26. April 2008, 20:03
von sechsrad
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.

Verfasst: Samstag 26. April 2008, 20:14
von EyDu
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.

Verfasst: Samstag 26. April 2008, 21:03
von sechsrad
jup, danke mit dem hinweiss.

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

mfg