为什么我在python中得到一个错误,说即使我之前定义了方法,也找不到方法?

时间:2010-07-21 05:49:43

标签: python

index = 0
def changeColor():
    global index
    if index%2==0:
        label.configure(bg = "purple")
    else:
        label.configure(bg = "blue")
    index+=1
    label.after(1000, changeColor)   

def Start (self): # command when start button is clicked in GUI
    self.root = Tk()
    self.root.geometry("500x300")
    mainContainer = Frame (self.root)
    label = Label(mainContainer, text = "")
    label.pack(side = LEFT, ipadx = 5, ipady = 5)
    mainContainer.pack()
    label.after(1000, changeColor)
    self.root.mainloop()

我收到错误消息:NameError:未定义全局名称'changeColor'。为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:2)

在我看来,问题可能是片段中没有的内容。这两个函数都是类定义的一部分吗?从使用self作为Start中的参数,并在changeColor中使用label,它看起来可能是。

如果是这样,让我们​​说它是Foo类,那么changeColor就是Foo.changeColor。要使用它,你可以将它拉到课堂外,或者从Start开始传递为self.changeColor。

编辑:您应该做的其他三件事情来清理风格:

  • 让changeColor将self作为参数,因此它是该类的正确方法。
  • 使标签成为对象的成员;即将其设为self.label,因此changeColor可以访问它。
  • 摆脱全球指数。相反,查询标签的当前颜色(self.label['bg'])以确定它所处的状态。

答案 1 :(得分:0)

试试这个

  index = 0
  def changeColor(self):
    global index
    if index%2==0:
      self.label.configure(bg = "purple")
    else:
        self.label.configure(bg = "blue")
    index+=1

def Start (self): # command when start button is clicked in GUI
    self.root = Tk()
    self.root.geometry("500x300")
    mainContainer = Frame (self.root)
    label = Label(mainContainer, text = "")
    label.pack(side = LEFT, ipadx = 5, ipady = 5)
    mainContainer.pack()
    label.after(1000, self.changeColor)
    # above should really be lambda: changeColor()
    self.root.mainloop()

工作示例

>>> def f(): print f
...
>>> def h(f): f()
...
>>> def g(): h(f)
...
>>> g()
<function f at 0x7f2262a8c8c0>