首頁 > 軟體

Python實現圖形化使用者介面計算器

2022-07-21 18:00:21

本文範例為大家分享了Python實現圖形化使用者介面計算器的具體程式碼,供大家參考,具體內容如下

簡易使用者圖形介面計算器設計思路:

簡易圖形化使用者介面計算器的介面和功能設計如下:

(1)第一行顯示輸入的運算表示式:第二行顯示當前輸入的作數或運算結果:第三行到篤七行為計算器按鈕·
(2)輸入擬作數·按數位0到9和小數點按鈕鍵時,可以輸入顯示運算元·
(3)運算元編輯。按“-”按鈕腱,可以清除當前輸入作數的最後一個字元:按“±”按鈕鍵,切換當前輸入數的正負號:按"C”按鈕腱,清除當前輸入的運算元·
(4)輸入運運算元·按運運算元“/、*`、+”按鈕鍵時,顯示到目前為止的輸入的運算表示式·
(5)執行運算·按“=”按鈕鍵,執行運算,顯示運算結果。

程式實現的基本思維和關鍵技術方法如下:

(1)建立一個繼承於Frame的類Calc來實現計算器。

(2)實現介面,在Calc建構函式,建立簡易圖形化使用者介面計算器的各個元件物件·

  (2-1)在Calc構造涵數中,建立兩個Label物件exprLabel(用於顯示運算表示式)和resultLabel(用於顯示當前輸入運算元或者運算結果)·建立兩個StringVar範例物件expr和result,並分別繫結到對應得Label物件。使用grid佈局,在第一行和第二行顯示兩個Label物件。
(2-2)在Calc建構函式中,使用一個二維列表儲存按鈕標籤buttons,然後使用巢狀迴圈的方法建立和佈局各個按鈕,在迴圈中定義事件處理常式cmd(),預設引數為按鈕標籤buttons([r][c]),呼叫實體方法click(key),從而實現使用一個函數(使用預設引數)處理所有的按鈕事件。

(3)事件處理。在事件處理常式click(self,key)中,按key的值,執行不同的處理邏輯,在建構函式中,建立一個變數startOf%NextOperand(預設為True),用於表示是否開始輸入下一個運算元·如果變數startOfNextOperand為True時,按數位鍵會設定當前輸入為0,重新輸入新的擬作數:如果變數startOfNextOperand為False時,繼續輸入當前擬作數的下一個數位字元。

  (3-1)按數位或者小數點按鈕鍵。把輸入的字元連結到當前輸入作數之後。
(3-2)按"C”按鈕鍵,清除當前輸人運算元的最後一個字元。
(3-3)按“±”按鈕腱,切換當前輸入數的正負號。
(3-4)按"C”按鈕鍵,清除當前輸人的運算元。
(3-5)按運運算元“/、*、、+”按鈕鍵時,顯示到目前為止的輸入的運算表示式。
(3-5)按“=”按鈕鍵,使用eval函數執行運算,顯示運算結果。

(4)在"if__name___=='__main____'"語句中編寫測試程式碼,建立Calc物件,並顯示執行結果。

import tkinter as tk
 
class Calculate(tk.Frame):
    def __init__(self, parent):
        """簡易計算器的建構函式"""
        tk.Frame.__init__(self, parent)
        self.pack()
        
        self.startOfNextOperand = True  # 開始輸入下一個運算元
 
        # 建立計算過程和結果的標籤
        self.expr = tk.StringVar()  #顯示運算表示式
        self.expr.set('')
        self.exprLabel = tk.Label(self, font = ('Helvetica', 10),
                                  fg = '#828282', width = 32, anchor='e', textvariable = self.expr)
        self.exprLabel.grid(row = 0, column = 0, columnspan = 4)
        self.result = tk.StringVar()      # 顯示結果
        self.result.set(0)  #結果初始為0
        self.resultLabel = tk.Label(self, font = ('Helvetica', 20),
                                    width = 16, anchor='e', textvariable=self.result)
        self.resultLabel.grid(row = 1, column = 0, columnspan = 4)
 
        # 計算器按鈕的標籤,使用2D列表表示
        buttons = [[ 'CE', 'C', '←', '/'],
                   ['7', '8', '9', '×'],
                   ['4', '5', '6', '-'],
                   ['1', '2', '3', '+'],
                   ['±', '0', '.', '=']]
 
        # 然後使用巢狀的迴圈的方法建立和佈局行各個按鈕
        for r in range(5):
            for c in range(4):
                # 定義事件處理常式cmd(),預設引數為按鈕標籤buttons[r][c]
                def cmd(key = buttons[r][c]):
                    self.click(key)
                b = tk.Button(self, text = buttons[r][c], width=8,command = cmd)
                b.grid(row = r+2, column = c)#前兩行顯示結果 按鈕從第三行開始
                
    def click(self, key):
        """事件處理常式"""
        if key == '=':   #按等號鍵時, 求值, 並顯示結果
            result = eval(self.expr.get() + self.result.get())
            self.result.set(result)
            self.expr.set('')
            self.startOfNextOperand = True
        elif key in '+-/×':
            if key == '×': key = '*'
            resultExpr = self.expr.get() + self.result.get() + key
            self.expr.set(resultExpr)
            self.result.set(0)
            self.startOfNextOperand = True
        elif key == 'C':  # 全部清空, 回到初始狀態
            self.expr.set('')
            self.result.set(0)
        elif key == 'CE':  # 清空當前輸入
            self.result.set(0)
        elif key == '←':
            oldnum = self.result.get()
            if len(oldnum) == 1: # 只有一個字元
                newnum = 0
            else:
                newnum = oldnum[:-1]
            self.result.set(newnum)
        elif key == '±':  # 正負號,切換正負號
            oldnum = self.result.get()  # 獲取原來的值
            if oldnum[0] == '-':
                newnum = oldnum[1:]
            else:
                newnum = '-' + oldnum
            self.result.set(newnum)
        else: # 按數位或者小數點鍵
            if self.startOfNextOperand:
                self.result.set(0)
                self.startOfNextOperand = False
            oldnum = self.result.get()  # 獲取原來的值
            if oldnum == '0':
                self.result.set(key)
            else:
                newnum = oldnum + key
                self.result.set(newnum)
 
if __name__ == '__main__':
    root = tk.Tk()
    root.title('簡易計算器')
    calculate = Calculate(root)
    root.mainloop()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com