为什么函数被视为全局变量

时间:2014-01-17 17:05:51

标签: python tkinter

我收到的错误是:未定义全局名称'OnButtonClick2'。我不确定程序是否将函数作为变量而不是函数读取,我不知道应该怎么做才能解决它。我通过了这两个参数,所以我很困惑为什么它不起作用。

import Tkinter

def convertDtoB(binary,left):                  
    if(left>0):                                 
        binary+=str(left%2)                     
        return convertDtoB(binary,left//2)      
    else:
        binary = int(binary[::-1])            
        return binary

def convertBtoD(decimal):                    
    answer = 0                                  
    length = len(str(decimal))                  
    decimal2 = str(decimal)[::-1]               
    for i in range(length):
        answer+=int(decimal2[i])*2**i
    return answer

class simpleapp_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.grid()

        self.entryVariable = Tkinter.StringVar()
        self.entry = Tkinter.Entry(self,textvariable=self.entryVariable)

        self.button1 = Tkinter.Button(self, text="Convert Decimal to Binary", command=lambda: self.OnButtonClick(1))
        self.button1.grid(column=1,row=1)

        self.button2 = Tkinter.Button(self, text="Convert Binary to Decimal", command=lambda: self.OnButtonClick(2))
        self.button2.grid(column=1,row=2)

        self.labelVariable = Tkinter.StringVar()
        label = Tkinter.Label(self,textvariable=self.labelVariable, anchor="center", bg="white")
        label.grid(column=1,row=0,columnspan=2,sticky='')
        self.labelVariable.set("Select a conversion.")

        self.grid_columnconfigure(0,weight=1)
        self.resizable(True,False)
        self.update()
        self.geometry(self.geometry())

    def OnButtonClick2(self, button_id):
        if button_id == 3:
            binaryNumber = convertDtoB("",self.decimalNumber)
            self.labelVariable = Tkinter.StringVar()
            label_2 = Tkinter.Label(self,textvariable=self.labelVariable, anchor="center", bg="white")
            label_2.grid(column=1,row=0,columnspan=2,sticky='')
            self.label_2.set(binaryNumber)
        elif button_id == 4:
            binaryNumber = convertBtoD("",self.binaryNumber)
            self.labelVariable = Tkinter.StringVar()
            label_2 = Tkinter.Label(self,textvariable=self.labelVariable, anchor="center", bg="white")
            label_2.grid(column=1,row=0,columnspan=2,sticky='')
            self.label_2.set(binaryNumber)

    def OnButtonClick(self, button_id):
        if button_id == 1:
            self.button1.destroy()
            self.button2.destroy()
            self.entryVariable = Tkinter.StringVar()
            self.entry = Tkinter.Entry(self,textvariable=self.entryVariable)
            self.entry.grid(column=1,row=0,sticky='EW')
            self.decimalNumber = self.entryVariable.set("Enter Decimal Number Here")
            self.entry.focus_set()
            self.entry.selection_range(0, Tkinter.END)

            button3 = Tkinter.Button(self, text="Click here to convert", command=lambda: self.OnButtonClick(3))
            button3.grid(column=1,row=1)

            self.OnButtonClick2(3)

        elif button_id == 2:
            self.button1.destroy()
            self.button2.destroy()
            self.entryVariable = Tkinter.StringVar()
            self.entry = Tkinter.Entry(self,textvariable=self.entryVariable)
            self.entry.grid(column=1,row=0,sticky='EW')
            self.binaryNumber = self.entryVariable.set("Enter Binary Number Here.")
            self.entry.focus_set()
            self.entry.selection_range(0, Tkinter.END)

            button4 = Tkinter.Button(self, text="Click here to convert", command=lambda: self.OnButtonClick(4))
            button4.grid(column=1,row=1)

            self.OnButtonClick2(4)


if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title('my application')
    app.mainloop()

4 个答案:

答案 0 :(得分:1)

如果在类中定义了这些函数,那么self的使用很可能是错误的,因此是该类的方法/成员函数。如果是这种情况:

您应该像这样调用方法:

self.OnButtonClick2(3)

假设这些函数是在类中定义的方法(否则你使用self是不正确的),那么这是在它自己的类中调用已定义方法的正确方法。

有关课程here的信息

答案 1 :(得分:0)

通过使用self我假设你在课堂上。要调用您想要使用的其他类方法:

self.OnButtonClick2(3)

答案 2 :(得分:0)

问题中的代码存在一些语法问题。

  • 没有针对功能/方法的前导'def'关键字
  • 在func / method声明后没有在线缩进。

这些功能......或类中的方法吗?我问,因为第一个参数是'自我'。让我相信这些是课堂上的方法。在哪种情况下调用你要做的方法:

self.OnButtonClick2(3)

答案 3 :(得分:0)

OnButtonClick2被定义为类的方法:

class simpleapp_tk(Tkinter.Tk):
    ...
    def OnButtonClick2(self, button_id):

执行此操作时,必须通过在其前面添加基于此类的对象实例来调用此函数。例如,要从课外调用它,你可以这样做:

app = simpleapp_tk()
...
app.OnButtonClick2(...)

如果要在类中调用或引用此函数,代码必须引用自身,按惯例,它是self。因此,要从类中调用函数,您可以这样做:

self.OnButtonClick(...)

在问题的原始版本中,您的代码中有一个地方省略了self.部分:

OnButtonClick2(self,3)

由于OnButtonCllick2仅存在于类中,并且因为您没有告诉python要使用哪个类实例来调用此函数,所以python假设您正在尝试调用全局函数。由于不存在具有该名称的全局函数,因此它会提供您报告的错误。

解决方案应该清楚:当您致电OnButtonClick时,在课堂内打电话时始终使用self.OnButtonClick