2013-12-18 50 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) 

有我評論的幾個問題......也許人會解決你的問題

,但我認爲真的很瞭解你的問題,所以我會去那個...

1

Your最大的問題是你試圖用一種叫做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