2013-12-18 3 views
1

Я пытаюсь сделать простой калькулятор с кнопками с номерами 0-9, плюс, минус, ясный и равный. У меня есть gui и функциональность кнопок, но мой калькулятор вычисляет более 999. Любые идеи? -Я попытался остановить его вычисление ниже 999, если вы посмотрите на строку 45-53.Предел вычисления калькулятора Python Tkinter

вот мой код:

from tkinter import * 

class Calculator(Frame): 

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


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

    need_clr = False 
    def digit(self, digit): 
     if self.need_clr: 
      self.display.set('') 
      self.need_clr = False 
     self.display.set(self.display.get() + digit) 

    def sign(self): 
     need_clr = False 
     cont = self.display.get() 
     if len(cont) > 0 and cont[0] == '-': 
      self.display.set(cont[1:]) 
     else: 
      self.display.set('-' + cont) 


    def oper(self, op): 
     self.display.set(self.display.get() + ' ' + op + ' ') 
     self.need_clr = False 

    def calc(self): 
     try: 
      self.display.set(eval(self.display.get())) 
      self.need_clr = True 
     except: 
      showerror('Operation Error', 'Illegal Operation') 
      self.display.set('') 
      self.need_clr = False 

    def equals(self): 
     try: 
      result = eval(self.display.get()) 
      if result >= 1000: 
       result (calc) 
     except: 
      results("ERROR") 
     display.delete(0, END) 
     display.insert(0, display) 

    def __init__(self): 
     Frame.__init__(self) 
     self.option_add('*Font', 'Dotum 15') 
     self.pack(expand=YES, fill=BOTH) 
     self.master.title('Simple Calculator') 

     self.display = StringVar() 
     e = Entry(self, relief=SUNKEN, textvariable=self.display) 
     e.pack(side=TOP, expand=YES, fill=BOTH) 

     for key in ("123", "456", "789"): 
      keyF = self.frame(TOP) 
      for char in key: 
       self.button(keyF, LEFT, char, 
          lambda c=char: self.digit(c)) 

     keyF = self.frame(TOP) 
     self.button(keyF, LEFT, '0', lambda ch='0': self.digit(ch)) 

     opsF = self.frame(TOP) 
     for char in "+-=": 
      if char == '=': 
       btn = self.button(opsF, LEFT, char, self.calc) 
      else: 
       btn = self.button(opsF, LEFT, char, 
            lambda w=self, s=char: w.oper(s)) 

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

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

@Totem: строка 45-53 является методом 'equals'. – abarnert

+2

Вместо того, чтобы говорить «строка 45-53», вы должны сказать «метод« равно ». Затем мы можем сказать, о чем вы говорите, без необходимости копировать и вставлять свой код в 'wc' или текстовый редактор или считать вручную. – abarnert

+0

@abarnet Спасибо. Я до сих пор не понимаю, почему вычисление более 999 не желательно, хотя .. – Totem

ответ

1

Я полагаю, вы говорите о

def equals(self): 
    try: 
     result = eval(self.display.get()) # <-- this is some risky business 
     if result >= 1000: #I think you want to check less than but its not clear, this is greater than or equal 
      result (calc) #result is a number you cannot do 5(some_argument) 
      #^^^^^^^^^^^ this line should probably end up as an error message ... 
     #you probably need an else here to handle if the number is too big 
     else: 
      raise ValueError("Value Too Large!!!") 
    except: 
     results("ERROR") #not sure what this line is doing ... 
    display.delete(0, END) 
    display.insert(0, display) 

Есть несколько проблем, я комментировал ... возможно, один будет решать ваш вопрос

но я думаю, действительно abarnert прибил вашу проблему, поэтому я бы пошел с этим ...

1

Ваш Большая проблема заключается в том, что вы попытались исправить это в методе equals, который вы никогда не звонили нигде в свой код. Таким образом, очевидно, это ничего не сделает.

Если вы посмотрите на то, где определяется ваша кнопка =, он делает это:

opsF = self.frame(TOP) 
for char in "+-=": 
    if char == '=': 
     btn = self.button(opsF, LEFT, char, self.calc) 

Таким образом, он вызывает метод calc. Вы должны изменить calc, чтобы повлиять на то, что он делает; добавление некоторого полностью отдельного метода, который никогда не будет вызван никуда, не поможет.

Если изменить это вызвать self.equals вместо self.calc, который решает эту первую проблему ... но, конечно, вы будете иметь целый ряд новых проблем, потому что большая часть кода в equals не имеет смысла, так как объясняет Joran Бизли , Посмотрите на код в calc как модель для того, чтобы сделать что-то в equals.

Однако, лучший дизайн, чем копирования/вставки/редактирования calc бы изменить его, чтобы назвать некоторые новый метод validate_result, как это:

def calc(self): 
    try: 
     self.display.set(self.validate_result(eval(self.display.get()))) 
     self.need_clr = True 
    except: 
     showerror('Operation Error', 'Illegal Operation') 
     self.display.set('') 
     self.need_clr = False 

Теперь вам просто нужно написать validate_result как функция, работает с числами и либо возвращает номер (или возвращает измененное число, если вы хотите), либо вызывает исключение. Не нужно дублировать всю работу, которую делает calc, она может просто позволить calc делать все это. Например:

def validate_result(self, result): 
    if result >= 1000: 
     raise ValueError('result too big!') 
    else: 
     return result 
Смежные вопросы