2014-03-06 121 views
1

我正在爲GCSE計算,我們的受控評估的任務之一是創建一個帶有GUI的計算器。如何使用tkinter在Python中使用GUI編程計算器?

我能夠編寫一個沒有GUI的簡單計算器,但我不明白如何使用GUI完成它。

下面是我從teampython.wordpress.com得到的代碼,我隱約可以理解,但如果有人能夠向我解釋每個單獨的步驟,這將非常有幫助。

# calc.py - a Python calculator 
from tkinter import * 


class Calc(): 
    def __init__(self): 
     self.total = 0 
     self.current = "" 
     self.new_num = True 
     self.op_pending = False 
     self.op = "" 
     self.eq = False 


    def num_press(self, num): 
     self.eq = False 
     temp = text_box.get() 
     temp2 = str(num)  
     if self.new_num: 
      self.current = temp2 
      self.new_num = False 
     else: 
      if temp2 == '.': 
       if temp2 in temp: 
        return 
      self.current = temp + temp2 
     self.display(self.current) 

    def calc_total(self): 
     self.eq = True 
     self.current = float(self.current) 
     if self.op_pending == True: 
      self.do_sum() 
     else: 
      self.total = float(text_box.get()) 

    def display(self, value): 
     text_box.delete(0, END) 
     text_box.insert(0, value) 

    def do_sum(self): 
     if self.op == "add": 
      self.total += self.current 
     if self.op == "minus": 
      self.total -= self.current 
     if self.op == "times": 
      self.total *= self.current 
     if self.op == "divide": 
      self.total /= self.current 
     self.new_num = True 
     self.op_pending = False 
     self.display(self.total) 

    def operation(self, op): 
     self.current = float(self.current) 
     if self.op_pending: 
      self.do_sum() 
     elif not self.eq: 
      self.total = self.current 
     self.new_num = True 
     self.op_pending = True 
     self.op = op 
     self.eq = False 

    def cancel(self): 
     self.eq = False 
     self.current = "0" 
     self.display(0) 
     self.new_num = True 

    def all_cancel(self): 
     self.cancel() 
     self.total = 0 

    def sign(self): 
     self.eq = False 
     self.current = -(float(text_box.get())) 
     self.display(self.current) 

sum1 = Calc() 
root = Tk() 
calc = Frame(root) 
calc.grid() 

root.title("Calculator") 
text_box = Entry(calc, justify=RIGHT) 
text_box.grid(row = 0, column = 0, columnspan = 3, pady = 5) 
text_box.insert(0, "0") 

numbers = "789456123" 
i = 0 
bttn = [] 
for j in range(1,4): 
    for k in range(3): 
     bttn.append(Button(calc, text = numbers[i])) 
     bttn[i].grid(row = j, column = k, pady = 5) 
     bttn[i]["command"] = lambda x = numbers[i]: sum1.num_press(x) 
     i += 1 

bttn_0 = Button(calc, text = "0") 
bttn_0["command"] = lambda: sum1.num_press(0) 
bttn_0.grid(row = 4, column = 1, pady = 5) 

bttn_div = Button(calc, text = chr(247)) 
bttn_div["command"] = lambda: sum1.operation("divide") 
bttn_div.grid(row = 1, column = 3, pady = 5) 

bttn_mult = Button(calc, text = "x") 
bttn_mult["command"] = lambda: sum1.operation("times") 
bttn_mult.grid(row = 2, column = 3, pady = 5) 

minus = Button(calc, text = "-") 
minus["command"] = lambda: sum1.operation("minus") 
minus.grid(row = 3, column = 3, pady = 5) 

point = Button(calc, text = ".") 
point["command"] = lambda: sum1.num_press(".") 
point.grid(row = 4, column = 0, pady = 5) 

add = Button(calc, text = "+") 
add["command"] = lambda: sum1.operation("add") 
add.grid(row = 4, column = 3, pady = 5) 

neg= Button(calc, text = "+/-") 
neg["command"] = sum1.sign 
neg.grid(row = 5, column = 0, pady = 5) 

clear = Button(calc, text = "C") 
clear["command"] = sum1.cancel 
clear.grid(row = 5, column = 1, pady = 5) 

all_clear = Button(calc, text = "AC") 
all_clear["command"] = sum1.all_cancel 
all_clear.grid(row = 5, column = 2, pady = 5) 

equals = Button(calc, text = "=") 
equals["command"] = sum1.calc_total 
equals.grid(row = 5, column = 3, pady = 5) 

root.mainloop() 

回答

9

所以,我會解釋你給出的代碼,據我瞭解。類Calc()包含這段代碼的所有功能。該結構意味着主GUI(稍後設置)可以輕鬆訪問每個功能。在Calc()班,你有你的功能(用def等表示)。這些包含這些代碼計算輸出的各種方法。

在課堂外,我們有Tkinter UI代碼。這段代碼構建了你的窗口,你的各種按鈕和顯示器位於其中。在這種情況下,按鈕和文本字段的位置由「網格」方法控制。如您所見,每次代碼設置一個對象(這裏只有Frame,ButtonEntry對象),則有一個關聯的.grid(row=x, column=y...etc)。這指定了UI中每個對象的相對位置。

for j in range(1,4): 
    for k in range(3): 
     bttn.append(Button(calc, text = numbers[i])) 
     bttn[i].grid(row = j, column = k, pady = 5) 
     bttn[i]["command"] = lambda x = numbers[i]: sum1.num_press(x) 
     i += 1 
:例如,使用網格方法,你可以通過給所述第一對象行= 1,列= 0和第二行= 2,列= 0等

for循環堆疊兩個對象

可能是用戶界面中唯一不直觀的部分,看看你是否剛剛開始。實質上,它所做的就是自動生成按鈕(節省您分別編碼每個按鈕的時間)。 循環中的前兩行(希望)明顯循環指定範圍中的值。在下面的行bttn.append(...在calc = Frame(root)設置的calc幀中創建一個按鈕對象,按鈕文本由數字列表給出(字面上是numbers="789456123")。最初,i = 0,因此數字[i]會返回列表中的第一個元素,數字[i]對於i = 1(下一次循環)將返回8,依此類推。 bttn.grid(row = j, column = k, pady = 5)使用前面提到的網格定位方法,但這裏j和k由循環本身的值給出(在行的情況下爲1到4之間的值,以及0到2 - 3列之間的值 - 在這種情況下列)。如果您運行代碼,您可以看到這將定位所有鍵盤按鈕以輸入數字。這個循環的最後一行(除了i + = 1,即給i加1),處理按鈕的一個命令。該命令將調用關聯的函數,在這種情況下,Calc()中的numpress函數。正如你可能看到的那樣,numpress自己用你按的任何號碼更新你的顯示器。

本例中最後一段代碼處理計算器的其餘操作,您會注意到每個代碼也遵循上述創建按鈕,分配命令並將按鈕定位到UI中的模式。通過上面的解釋,您可能會看到Calc()中的每個其餘功能都支配算術操作或清除等。

我意識到這是一個文本牆,但我希望它有幫助!如果我一直不清楚或者有什麼特別的東西你不明白,讓我知道,我會盡力解釋它(我早已不瞭解自己!)。

你可能會覺得這個Tkinter UI Guide有用,我從那個指南中學到了很多基礎知識。

好運

0

您需要使用GUI庫在Python一樣PyQt4wxPythonTkinter。這個問題太廣泛了,不能給你更多的細節。

從教程開始,教你如何使用Python創建GUI所需的基礎知識。

PS:我個人建議你去PyQt

+3

爲什麼要用PyQt?對於正在學習GUI編程的初學者來說,tkinter有什麼問題?這是一個*奇妙的GUI學習工具包,加上它可能已經安裝。我對PyQt沒有任何反應,但是如果你要提供建議,至少應該解釋一下你爲什麼建議採用不同的方法。沒有解釋,建議是沒用的。 –