带有条件的wxpython的del class意外地工作

时间:2016-04-17 09:23:39

标签: python wxpython conditional del

我正在尝试在条件完成时删除类的实例。 但是我遇到了问题,因为它在进入条件之前被删除了。 我不知道发生了什么...... 代码使用wxpython和一些按钮来删除ítems,所以我在init上正确构建按钮但是当我尝试删除一个ítem时,在它到达第一个条件之前,它似乎被las条件删除了,应该永远不会之前。 所以我不知道问题来自哪里...... 我第一次按下“deleteitem”按钮时得到的错误是:

'在赋值之前引用的局部变量'T'(在第6行:...如果T.items> 0:)

但如果我删除最后一行del(T),它不会给出任何错误。

以下是基本代码:

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)

编辑:

好的,正如我首先发布的示例可以工作,这里的代码不起作用:

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()

最终工作代码:

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()

1 个答案:

答案 0 :(得分:0)

你遗漏了一些相关的代码,因为这段代码:

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)

执行没有错误。

在任何情况下,听起来您的代码都是Variable scope in nested functions的变体。

对新代码的回复:

据我所知,del本地化了一个变量:

示例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()

示例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

所以看起来解析器将T标记为dostuff()函数中的局部变量 - 因为你只能del本地名称(除非你声明T在dostuff()中是全局的)。结果,python不会在dostuff()函数外面看到T的值。

因此,另一种解决方案(不推荐)是这样做的:

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()

要解决您的问题,我会将以下内容添加到__init__()函数的末尾:

self.T = Test()

或者,您可以将T作为参数传递给__init__()。它通常被认为是一种糟糕的程序设计,在一个类中操作全局变量。