我收到的错误是:未定义全局名称'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()
答案 0 :(得分:1)
如果在类中定义了这些函数,那么self
的使用很可能是错误的,因此是该类的方法/成员函数。如果是这种情况:
您应该像这样调用方法:
self.OnButtonClick2(3)
假设这些函数是在类中定义的方法(否则你使用self
是不正确的),那么这是在它自己的类中调用已定义方法的正确方法。
有关课程here的信息
答案 1 :(得分:0)
通过使用self
我假设你在课堂上。要调用您想要使用的其他类方法:
self.OnButtonClick2(3)
答案 2 :(得分:0)
问题中的代码存在一些语法问题。
这些功能......或类中的方法吗?我问,因为第一个参数是'自我'。让我相信这些是课堂上的方法。在哪种情况下调用你要做的方法:
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
。