日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python實現圖形用戶界面計算器_python

作者:Yvonnae ? 更新時間: 2022-09-15 編程語言

本文實例為大家分享了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()

原文鏈接:https://blog.csdn.net/m0_53354306/article/details/123824771

欄目分類
最近更新