【问题标题】:Any fix to this error ---> TypeError: 'StringVar' object is not callable对此错误的任何修复---> TypeError: 'StringVar' object is not callable
【发布时间】:2020-12-11 14:28:01
【问题描述】:

我正在尝试创建这个 GUI 计算器,但似乎“StringVar”对象不可调用。我的其他运算符(例如 -、*、/、= 等)仍然存在此问题。(我刚接触编码和 python 世界),

从 tkinter 导入 Tk、Label、StringVar、Entry、Button、W、E

类计算器: 操作数:StringVar 运营商:无 结果:浮动

def __init__(self):
    master = Tk()        
    self.operator = None
    self.operand = StringVar()
    self.result = 0
    
         
    Label(master,text = "Calculator").grid(row = 0, column=0, columnspan=2)
    
    UserInputEntry = master.register(self.operandValid)
    Entry(master, validate="key", validatecommand=(UserInputEntry,'%P'), textvariable=self.operand).grid(row=0, column=0, columnspan=3)
                                     
    addAction = lambda: self.operand(lambda a, b: a+b)
    Button(master,text = "+",command=addAction).grid(row=1, column=3, sticky=W+E)
    
    subAction = lambda: self.operand(lambda a, b: a-b)
    Button(master,text = "-",command=subAction).grid(row=2, column=3, sticky=W+E)
    
    mulAction = lambda: self.operand(lambda a, b: a*b)
    Button(master,text = "X",command=mulAction).grid(row=3, column=3, sticky=W+E)
    
    divAction = lambda: self.operand(lambda a, b: a/b)
    Button(master,text = "/",command=divAction).grid(row=4, column=3, sticky=W+E)
    
    equal = lambda: self.operand(None)
    Button(master,text = "=",command=equal).grid(row=4, column=2, sticky=W+E)       
    
    enter1 = lambda: self.enterNumber("1")
    Button(master,text = "1",command=enter1).grid(row=1, column=0, sticky=W+E)
    
    
    enter2 = lambda: self.enterNumber("2")
    Button(master,text = "2",command=enter2).grid(row=1, column=1, sticky=W+E)
    
    enter3 = lambda: self.enterNumber("3")
    Button(master,text = "3",command=enter3).grid(row=1, column=2, sticky=W+E)
    
    
    enter4 = lambda: self.enterNumber("4")
    Button(master,text = "4",command=enter4).grid(row=2, column=0, sticky=W+E)
    
    enter5 = lambda: self.enterNumber("5")
    Button(master,text = "5",command=enter5).grid(row=2, column=1, sticky=W+E)
    
    enter6 = lambda: self.enterNumber("6")
    Button(master,text = "6",command=enter6).grid(row=2, column=2, sticky=W+E)
    
    enter7 = lambda: self.enterNumber("7")
    Button(master,text = "7",command=enter7).grid(row=3, column=0, sticky=W+E)
    
    enter8 = lambda: self.enterNumber("8")
    Button(master,text = "8",command=enter8).grid(row=3, column=1, sticky=W+E)
    
    enter9 = lambda: self.enterNumber("9")
    Button(master,text = "9",command=enter9).grid(row=3, column=2, sticky=W+E)
    
    enter0 = lambda: self.enterNumber("0")
    Button(master,text = "0", command=enter0).grid(row=4, column=0, sticky=W+E)
    
    enterDecimal = lambda: self.enterNumber(".")
    Button(master,text=".",command=enterDecimal).grid(row=4, column=1, sticky=W+E)
    
    master.mainloop()
    
    
def operation(self, op):
    print("The previous operation was {self.operation}")
    self.result = self.operator(self.result, float(self.operand))
    self.operator = op

def operandValid(self, operand):
    try: 
        operand = float(operand)
        return True
    except:
        return False
def enterNumber(self,character): 
            
    #if self.resultDisplayed: 
        #self.resultDisplayed = False
        #self.operand.set("")#reset the Entry for new input
    
    if(self.operandValid(self.operand.get()+character)):
        self.operand.set(self.operand.get()+character)

计算器()

addAction = lambda: self.operand(lambda a, b: a+b) TypeError: 'StringVar' 对象不可调用

【问题讨论】:

  • self.operand = StringVar(末尾没有括号)?
  • 括号必须在 init 方法中但不在类中,

标签: python tkinter calculator


【解决方案1】:

那是因为您正在执行与StringVar()(lambda a, b: a+b) 等效的操作。您应该将 lambda 留在 self.operand 中,并保留其他所有内容。

【讨论】:

  • 你是这个意思吗? addAction = self.operand(lambda a, b: a+b)
  • 不,self.operand 不是一个函数,你还在调用它,所以只需将 addAction 分配给 lambada am b: a + b,其他操作也一样
  • 我打错了:应该是a, b 而不是am b
猜你喜欢
  • 2013-05-28
  • 2018-01-26
  • 1970-01-01
  • 2016-03-25
  • 2013-05-25
  • 2022-11-20
  • 1970-01-01
  • 2021-09-15
  • 2018-03-31
相关资源
最近更新 更多