2013-01-03 8 views
-7

J'ai trouvé ce code de la calculatrice sur Internet.calculatrice python

Je veux ajouter une fonction, comme le pow() mais il renvoie une erreur.

L'erreur:

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

AttributeError: StringVar instance has no attribute '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() 
+2

Quelle est l'erreur? Aidez-nous à vous aider. Ne faites pas les gens lire votre code pour comprendre ce que vous faites mal. – duffymo

+0

partout où vous avez obtenu ce code, c'est mauvais, en utilisant 'eval' n'est pas bon. déjà. –

+0

@InbarRose - 'eval' existe pour une raison. Guido n'a jamais reculé de supprimer/changer la langue pour supprimer des choses inutiles - Ainsi, Guido au moins encore croit que 'eval' a une place dans la langue (je fais). Cependant, vous avez certainement raison de ne pas l'utiliser avec désinvolture, surtout si vous envisagez de partager le code avec d'autres. – mgilson

Répondre

1

vous ne pouvez pas donner le display en tant que paramètre à la fonction pow, il attend un certain nombre. et n'oubliez pas de régler l'affichage.

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