2016-04-17 2 views
0

Ich versuche, eine Instanz einer Klasse zu löschen, wenn eine Bedingung erfüllt ist. Aber ich habe Probleme, weil es gelöscht wird, bevor es in die Bedingung eintritt. Ich weiß nicht, was los ist ... Der Code verwendet wxpython mit einigen Tasten zum Löschen von Elementen, so dass ich die Tasten korrekt init erstellen, aber wenn ich versuche, ein Element zu löschen, bevor es die erste Bedingung erreicht, es scheint durch die las bedingt gelöscht zu werden, das sollte vorher nie gemacht werden. So Ich weiß nicht, wo das Problem herkommt ... Der Fehler erhalte ich, wenn ich die Taste ‚DeleteItem‘ drücke zum ersten Mal ist:del Klasse mit wxpython innerhalb bedingte funktioniert unerwartet

‚lokal Variable‚T‘verwies vor der Zuweisung‘ (in 6. die Zeile: ... wenn T.items> 0 :)

Aber wenn ich die letzte Zeile del (T) lösche gibt es keinen Fehler.

geht hier den Grundcode:

class Test(object): 
    def __init__(self): 
     self.items=8 

T=Test() 



if button.GetName()=='deleteitem': 
    if T.items>0: 
     T.items-=1 
     if T.items<0: 
      del(T) 

EDITED:

OK, wie das Beispiel ich zunächst geschrieben funktionieren kann, hier den Code geht, die Arbeit spielt keine:

import wx 

class Test(object): 
    def __init__(self): 
     self.items=8 

T=Test() 

class MyFrame(wx.Frame): 

    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, -1, title, 
          pos=(150, 150), size=(350, 200)) 

     self.btn = wx.Button(self, -1, "Press to delete Item, current Items: "+str(T.items)) 
     self.Bind(wx.EVT_BUTTON, self.OnButton, self.btn) 


    def OnButton(self, evt): 
     print 'Current Items: '+str(T.items) 
     self.btn.SetLabel('Press to delete Item, current Items: '+str(T.items)) 
     if T.items>0: 
      T.items-=1 
      if T.items==0: 
       del(T) 


class MyApp(wx.App): 
    def OnInit(self): 
     frame = MyFrame(None, "Simple wxPython App") 
     frame.Show(True) 
     return True 

app = MyApp() 
app.MainLoop() 

ENDGÜLTIGER ARBEITSCODE:

import wx 

class Test(object): 
    def __init__(self): 
     self.items=8 

class MyFrame(wx.Frame): 

    def __init__(self, parent, title): 
     self.T=Test() 
     wx.Frame.__init__(self, parent, -1, title, 
          pos=(150, 150), size=(350, 200)) 

     self.btn = wx.Button(self, -1, "Press to delete Item, current Items: "+str(self.T.items)) 
     self.Bind(wx.EVT_BUTTON, self.OnButton, self.btn) 


    def OnButton(self, evt): 
     if self.T.items>0: 
      self.T.items-=1 
      if self.T.items==0: 
       del(self.T) 
       self.btn.SetLabel('Deleted instance T') 
      else: 
       self.btn.SetLabel('Press to delete Item, current Items: '+str(self.T.items)) 
       print 'current Items: '+str(self.T.items) 

class MyApp(wx.App): 
    def OnInit(self): 
     frame = MyFrame(None, "Simple wxPython App") 
     frame.Show(True) 
     return True 

app = MyApp() 
app.MainLoop() 

Antwort

0

Sie verlassen einige relevante Code aus, weil dieser Code:

class Test(object): 
    def __init__(self): 
     self.items=8 

T=Test() 



if True: 
    if T.items>0: 
     T.items-=1 
     if T.items<0: 
      del(T) 

ohne Fehler ausgeführt.

In jedem Fall klingt es wie Ihr Code ist eine Variation von Variable scope in nested functions.

Antwort auf neuen Code:

Soweit ich das beurteilen kann, lokalisiert del eine Variable:

Beispiel 1:

class Test(object): 
    def __init__(self): 
     self.items=8 

T = Test() 

class Dog(object): 
    def dostuff(self): 
     print 'executing dostuff()' 
     if T.items > 10: #This will never be True 
      T 

Dog().dostuff() 

--output:-- 
executing dostuff() 

Beispiel 2:

class Test(object): 
    def __init__(self): 
     self.items=8 

T = Test() 

class Dog(object): 
    def dostuff(self): 
     print 'executing dostuff()' 
     if T.items > 10: #This will never be True 
      del T 


Dog().dostuff() 

--output:-- 
executing dostuff() 
Traceback (most recent call last): 
    File "1.py", line 14, in <module> 
    Dog().dostuff() 
    File "1.py", line 10, in dostuff 
    if T.items > 10: 
UnboundLocalError: local variable 'T' referenced before assignment 

So sieht es aus wie der Parser ma rks T als lokale Variable in der Funktion dostuff() - weil Sie nur del lokale Namen verwenden können (außer Sie deklarieren T innerhalb von dostuff() als global). Als Ergebnis wird, Python aussehen außerhalb der dostuff() Funktion nicht für den Wert von T.

daher eine andere Lösung (nicht empfohlen) wäre dies zu tun:

class Test(object): 
    def __init__(self): 
     self.items=8 

T = Test() 

class Dog(object): 
    def dostuff(self): 
     global T #<===HERE 
     print 'executing dostuff()' 

     if T.items > 10: 
      del T 


Dog().dostuff() 

--output:-- 
executing dostuff() 

Ihr Problem zu lösen

self.T = Test() 

Oder Sie T als Argument an __init__() passieren könnte:, würde ich folgendes Ende Ihrer __init__() Funktion hinzuzufügen.Es wird allgemein als schreckliches Programmdesign angesehen, Funktionen in einer Klasse zu haben, die globale Variablen manipuliert.

+0

Danke 7stud, Es scheint, dass der Fehler in dem Link, den Sie postet, verwandt ist ... Aber wie auch immer, ich habe den Code aktualisiert, so dass es jetzt nicht funktioniert. –

+0

Vielen Dank 7stud! Es funktioniert perfekt! ... Ich bearbeitete und postete den neuen Arbeitscode, –

+0

@RubenMedrano, In Ihrem Post las ich: * Aber wenn ich die letzte Zeile del (T) lösche gibt es keinen Fehler. *, Der alles negiert Ich behauptete, dass es passierte. Wenn Sie schauen wollen, habe ich meine Erklärung geändert. – 7stud