【问题标题】:python calculator [closed]python计算器[关闭]
【发布时间】:2012-12-17 21:32:33
【问题描述】:

我在网上找到了这个计算器代码。

我想添加一些函数,例如 pow() 但它返回错误。

错误:

button(powF, LEFT, 'pow', lambda w=display: w.set(w.pow()))

AttributeError: StringVar 实例没有属性'pow'


from Tkinter import * 
import math

def frame(root, side):
   w = Frame(root)
   w.pack(side=side, expand=YES, fill=BOTH) 
   return w

def button(root, side, text, command=None):
   w = Button(root, text=text, command=command)
   w.pack(side=side, expand=YES, fill=BOTH)
   return w

class Calculator(Frame):
   def __init__(self):
       Frame.__init__(self)
       self.option_add('*Font', 'Verdana 20 bold') 
       self.pack(expand=YES, fill=BOTH)  
       self.master.title('tk') 
       self.master.iconname("calcu1ator") 

       display = StringVar()
     Entry(self,relief=SUNKEN,textvariable=display).pack(side=TOP,expand=YES,fill=BOTH)
   
       for key in ("123", "456", "789", "-0."):
           keyF = frame(self, TOP)
       
           for char in key:
               button(keyF, LEFT, char,lambda w=display, c=char: w.set(w.get() + c))
           
       opsF = frame(self, TOP)
   
       for char in "+-*/=":
           if char == '=':
               btn = button(opsF, LEFT, char)
               btn.bind('<ButtonRelease-1>',lambda e, s=self, w=display: s.calc(w), '+')
           else:
               btn = button(opsF, LEFT, char,lambda w=display, s=' %s '%char:w.set(w.get()+s))

       clearF = frame(self, BOTTOM)
       button(clearF, LEFT, 'Clr', lambda w=display: w.set(''))
   
       #powF = frame(self, BOTTOM)
       #button(powF, LEFT, 'pow', lambda w=display: pow(w,2))

   def calc(self, display):
       try:
           display.set(eval(display.get()))
       except:
           display.set("ERROR")

if __name__ == '__main__':
   Calculator().mainloop() 

【问题讨论】:

  • 错误是什么?帮助我们帮助您。不要让人们阅读你的代码来找出你做错了什么。
  • 无论您从哪里获得此代码,都不好,使用eval 不好。永远。
  • @InbarRose -- eval 存在是有原因的。 Guido 从未放弃删除/更改语言以删除不必要的内容——因此,Guido 至少仍然相信 eval 在语言中占有一席之地(我愿意)。但是,您绝对正确,不应该轻率地使用它——尤其是如果您打算与他人共享代码。

标签: python


【解决方案1】:

您不能将display 作为参数提供给pow 函数,它需要一个数字。并且不要忘记设置显示。

   powF = frame(self, BOTTOM)
   button(powF, LEFT, 'pow', lambda w=display: w.set(pow(float(w.get()),2)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2011-07-26
    • 2012-10-30
    • 1970-01-01
    相关资源
    最近更新 更多