Python?tkinter實現(xiàn)計算器功能
本文實例為大家分享了Python tkinter實現(xiàn)計算器功能的具體代碼,供大家參考,具體內(nèi)容如下
python版本:3.5
一.計算器的功能描述
今天我們用python來實現(xiàn)一個計算器。首先,計算器分為兩部分:一部分是初級頁面,包括簡單的加減乘除四則運算。第二部分:是高級頁面,包括常見的三角函數(shù)、對數(shù)、括號、等參數(shù)運算。其次,在初級頁面,能進行簡單的初級運算,并在初級頁面設(shè)置高級按鈕,并讓其高亮顯示,用戶點擊高級按鈕后,會切換到高級頁面。來到高級頁面,讓擴展的功能高亮顯示,同時可以參加高級運算。并且在高級頁面留有初級頁面按鈕,點擊可以回到初級頁面。相關(guān)效果截圖在文章末尾。
整個運算保留小數(shù)點10位有效數(shù)字。
二.代碼實現(xiàn)
Calculate.py的實現(xiàn)
我們此次屬于python自帶的一個庫tkinter,有自帶的GUI用起來很方便。
1. 導(dǎo)包
import tkinter as tk import tkinter.messagebox import re import math from functions import *
import導(dǎo)入包,as是給tkinter重新起了個名字,messagebox是一個錯誤提示框(如:分母為0,會錯誤提示)
functions.py是一個自定義函數(shù),計算數(shù)值時用。
2. 初始化初級界面
root = tk.Tk() root.minsize(300, 400) ? ? ?# 窗口大小300*400 root.resizable(0, 0) root.title('Jhze的計算器') ? ?# 計算器名字
3. 創(chuàng)建初級頁面
生成初級頁面的所有按鈕,這里看起來代碼很累贅,嘗試用循環(huán)實現(xiàn),但是循環(huán)生成的按鈕樣子不好看,沒有調(diào)到想要的效果。所以就選擇這樣一個一個的生成。
這里利用button中一個很重要的參數(shù)command來回調(diào)函數(shù),具體就是你可以通過點擊按鈕來獲取想應(yīng)的值,并且做相關(guān)的操作。
# 運算符號按鈕 # 第一行 btnac = tkinter.Button(root, text='AC', bd=0.5, font=('黑體', 20), fg='orange', command=lambda \ ? ? ? ? x='AC': buttonClick(x)) btnac.place(x=0, y=150, width=75, height=50) btnback = tkinter.Button(root, text='←', font=('微軟雅黑', 20), fg='#4F4F4F', bd=0.5, command=lambda \ ? ? ? ? x='←': buttonClick(x)) btnback.place(x=75, y=150, width=75, height=50) btndivi = tkinter.Button(root, text='^', font=('微軟雅黑', 20), fg='#4F4F4F', bd=0.5, command=lambda \ ? ? ? ? x='^': buttonClick(x)) btndivi.place(x=150, y=150, width=75, height=50) btnmul = tkinter.Button(root, text='+', font=('微軟雅黑', 20), fg="#4F4F4F", bd=0.5, command=lambda \ ? ? ? ? x='+': buttonClick(x)) btnmul.place(x=225, y=150, width=75, height=50) # 第二行 btn7 = tkinter.Button(root, text='7', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='7': buttonClick(x)) btn7.place(x=0, y=200, width=75, height=50) btn8 = tkinter.Button(root, text='8', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='8': buttonClick(x)) btn8.place(x=75, y=200, width=75, height=50) btn9 = tkinter.Button(root, text='9', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='9': buttonClick(x)) btn9.place(x=150, y=200, width=75, height=50) btnsub = tkinter.Button(root, text='-', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='-': buttonClick(x)) btnsub.place(x=225, y=200, width=75, height=50) # 第三行 btn4 = tkinter.Button(root, text='4', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='4': buttonClick(x)) btn4.place(x=0, y=250, width=75, height=50) btn5 = tkinter.Button(root, text='5', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='5': buttonClick(x)) btn5.place(x=75, y=250, width=75, height=50) btn6 = tkinter.Button(root, text='6', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='6': buttonClick(x)) btn6.place(x=150, y=250, width=75, height=50) btnadd = tkinter.Button(root, text='×', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='×': buttonClick(x)) btnadd.place(x=225, y=250, width=75, height=50) # 第四行 btn1 = tkinter.Button(root, text='1', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='1': buttonClick(x)) btn1.place(x=0, y=300, width=75, height=50) btn2 = tkinter.Button(root, text='2', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='2': buttonClick(x)) btn2.place(x=75, y=300, width=75, height=50) btn3 = tkinter.Button(root, text='3', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='3': buttonClick(x)) btn3.place(x=150, y=300, width=75, height=50) btnechu = tkinter.Button(root, text='÷', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='÷': buttonClick(x)) btnechu.place(x=225, y=300, width=75, height=50) # 第五行 btnper = tkinter.Button(root, text='高級', font=('微軟雅黑', 20), fg='orange', bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? command=lambda x='高級': buttonClick(x)) btnper.place(x=0, y=350, width=75, height=50) btn0 = tkinter.Button(root, text='0', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='0': buttonClick(x)) btn0.place(x=75, y=350, width=75, height=50) btnpoint = tkinter.Button(root, text='.', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? x='.': buttonClick(x)) btnpoint.place(x=150, y=350, width=75, height=50) btnequ = tkinter.Button(root, text='=', bg='orange', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? command=lambda x='=': buttonClick(x)) btnequ.place(x=225, y=350, width=75, height=50)
4.繪制輸出文本框
contentVar = tkinter.StringVar(root, '') contentEntry = tkinter.Entry(root, textvariable=contentVar, state='readonly', font=("Arial", 12)) contentEntry.place(x=0, y=110, width=300, height=40)
5.低級頁面的響應(yīng)事件處理
這里我們通過buttonClick()來響應(yīng)事件。
1.如果btn是‘0123456789’數(shù)值,直接賦值給content。
2.如果btn是‘AC’,響應(yīng)清屏
3.如果btn是‘←’,回退一個字符,其實這里最方便的是用切片法很容易實現(xiàn)
4.如果btn是‘=’,則將content這個字符串計算值,并輸出。因為是初級頁面,只有簡單的四則運算,完全可以用python自帶的函數(shù)eval()來計算值。
def buttonClick(btn): ? ? content = contentVar.get() ? ? if content.startswith('.'): ?# 小數(shù)點前加0 ? ? ? ? content = '0' + content ? ? if btn in '0123456789': ? ? ? ? content += btn ? ? elif btn == '.': ? ? ? ? lastPart = re.split(r'\+|-|\*|/', content)[-1] ? ? ? ? if '.' in lastPart: ? ? ? ? ? ? tk.messagebox.showerror('錯誤', 'Input Error') ? ? ? ? ? ? return ? ? ? ? else: ? ? ? ? ? ? content += btn ? ? elif btn == 'AC': ? ? ? ? content = '' ? ? elif btn == '=': ? ? ? ? try: ? ? ? ? ? ? for operat in content: ? ? ? ? ? ? ? ? if operat == '÷': ? ? ? ? ? ? ? ? ? ? content = content.replace('÷', '/') ? ? ? ? ? ? ? ? elif operat == '×': ? ? ? ? ? ? ? ? ? ? content = content.replace('×', '*') ? ? ? ? ? ? value = eval(content) ? ? ? ? ? ? content = str(round(value, 10)) ? ? ? ? except: ? ? ? ? ? ? tk.messagebox.showerror('錯誤', 'VALUE ERROR') ? ? ? ? ? ? return ? ? elif btn in operators: ? ? ? ? if content.endswith(operators): ? ? ? ? ? ? tk.messagebox.showerror('錯誤', 'FORMAT ERROR') ? ? ? ? ? ? return ? ? ? ? content += btn ? ? elif btn == '^': ? ? ? ? n = content.split('.') ? ? ? ? if all(map(lambda x: x.isdigit(), n)): ? ? ? ? ? ? content = eval(content)*eval(content) ? ? ? ? else: ? ? ? ? ? ? tk.messagebox.showerror('錯誤', 'Input Error') ? ? ? ? ? ? return ? ? elif btn == '←': ?# 如果按下的是退格‘',則選取當(dāng)前數(shù)字第一位到倒數(shù)第二位 ? ? ? ? content = content[0:-1] ? ? elif btn == '高級':
其實此時已經(jīng)實現(xiàn)了一個簡單的初級頁面,能進行四則運算,并且能輸出相應(yīng)的值。就差高級這個接口的實現(xiàn)啦,接下來就讓我們來實現(xiàn)高級這個按鈕的功能吧。
6.低級頁面中高級按鈕的實現(xiàn)
[注意]:以下代碼全部都是在“高級”這個按鈕下來實現(xiàn)的,注意python語言的縮進。也就是在上述的 elif btn==‘高級’:之下實現(xiàn)。
點擊高級按鈕之后,響應(yīng)對應(yīng)事件,因為我們頁面大小不變,所以我們需要調(diào)用btnac.destroy() 來銷毀低級頁面的按鈕,同理調(diào)用:btn1.destroy()、btn2.destroy()等等。也就意味著把初級頁面的按鈕全部銷毀,重新布局。此時有7行按鈕生成。
這里我說一下最初的構(gòu)思,本來想點擊高級按鈕之后,將原來的按鈕縮小比例,并且增加新的高級按鈕。這樣可以實現(xiàn),而且減少頁面布局代碼,但是這樣做的同時,初級界面的那個‘高級’按鈕還會在,曾試圖改變它的名稱,但效果不是很好。并且高級與初級頁面在計算的時候都是用的同一種方法,通過command回調(diào)函數(shù)來實現(xiàn)。高級頁面需要正則表達式對點擊獲取的字符串進行處理。所以出現(xiàn)諸多問題。因此沒有用頁面按鈕比例縮小的那構(gòu)思。而是直接將初級頁面的按鈕全部清理,重新布局。這樣就解決了那些問題。也完成了高級<---->低級頁面的來回跳轉(zhuǎn)??雌饋碛蟹N縮放的效果。請讀者自行體會。
contentEntry.place(x=0, y=45, width=300, height=40) # 重新繪制輸出框 ? ? ? ? # 運算符號按鈕 ? ? ? ? # 第一行 ? ? ? ? btncsc = tkinter.Button(root, text='csc', font=('微軟雅黑', 20), bg=('#96CDCD'), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? command=lambda x='csc': buttonClick1(x)) ? ? ? ? btncsc.place(x=0, y=85, width=60, height=45) ? ? ? ? btnrad = tkinter.Button(root, text='rad', font=('微軟雅黑', 20), bg=('#96CDCD'), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? command=lambda x='rad': buttonClick1(x)) ? ? ? ? btnrad.place(x=60, y=85, width=60, height=45) ? ? ? ? btnsin = tkinter.Button(root, text='sin', font=('微軟雅黑', 20), bg=('#96CDCD'), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? command=lambda x='sin': buttonClick1(x)) ? ? ? ? btnsin.place(x=120, y=85, width=60, height=45) ? ? ? ? btncos = tkinter.Button(root, text='cos', font=('微軟雅黑', 20), bg=('#96CDCD'), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? command=lambda x='cos': buttonClick1(x)) ? ? ? ? btncos.place(x=180, y=85, width=60, height=45) ? ? ? ? btntan = tkinter.Button(root, text='tan', font=('微軟雅黑', 20), bg=('#96CDCD'), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? command=lambda x='tan': buttonClick1(x)) ? ? ? ? btntan.place(x=240, y=85, width=60, height=45) ? ? ? ? # 第二行 ? ? ? ? btnxsec = tkinter.Button(root, text='sec', font=('微軟雅黑', 20), bg=('#96CDCD'), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?command=lambda x='sec': buttonClick1(x)) ? ? ? ? btnxsec.place(x=0, y=130, width=60, height=45) ? ? ? ? btnlog = tkinter.Button(root, text='lg', font=('微軟雅黑', 20), bg=('#96CDCD'), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? command=lambda x='lg': buttonClick1(x)) ? ? ? ? btnlog.place(x=60, y=130, width=60, height=45) ? ? ? ? btnln = tkinter.Button(root, text='ln', font=('微軟雅黑', 20), bg=('#96CDCD'), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?command=lambda x='ln': buttonClick1(x)) ? ? ? ? btnln.place(x=120, y=130, width=60, height=45) ? ? ? ? btnleft = tkinter.Button(root, text='(', font=('微軟雅黑', 20), bg=('#96CDCD'), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?command=lambda x='(': buttonClick1(x)) ? ? ? ? btnleft.place(x=180, y=130, width=60, height=45) ? ? ? ? btnrigh = tkinter.Button(root, text=')', font=('微軟雅黑', 20), bg=('#96CDCD'), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?command=lambda x=')': buttonClick1(x)) ? ? ? ? btnrigh.place(x=240, y=130, width=60, height=45) ? ? ? ? # 第三行 ? ? ? ? btnaxy = tkinter.Button(root, text='x^y', bd=0.5, font=('黑體', 20), bg=('#96CDCD'), command=lambda \ ? ? ? ? ? ? ? ? x='x^y': buttonClick1(x)) ? ? ? ? btnaxy.place(x=0, y=175, width=60, height=45) ? ? ? ? btnac.destroy() ? ? ? ? btnac1 = tkinter.Button(root, text='AC', bd=0.5, font=('黑體', 20), fg='orange', command=lambda \ ? ? ? ? ? ? ? ? x='AC': buttonClick1(x)) ? ? ? ? btnac1.place(x=60, y=175, width=60, height=45) ? ? ? ? btnback.destroy() ? ? ? ? btnback1 = tkinter.Button(root, text='←', font=('微軟雅黑', 20), fg='#4F4F4F', bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='←': buttonClick1(x)) ? ? ? ? btnback1.place(x=120, y=175, width=60, height=45) ? ? ? ? btndivi.destroy() ? ? ? ? btndivi1 = tkinter.Button(root, text='^', font=('微軟雅黑', 20), fg='#4F4F4F', bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='^': buttonClick1(x)) ? ? ? ? btndivi1.place(x=180, y=175, width=60, height=45) ? ? ? ? btnmul.destroy() ? ? ? ? btnmul1 = tkinter.Button(root, text='+', font=('微軟雅黑', 20), fg="#4F4F4F", bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='+': buttonClick1(x)) ? ? ? ? btnmul1.place(x=240, y=175, width=60, height=45) ? ? ? ? # 第四行 ? ? ? ? btnx = tkinter.Button(root, text='X!', font=('微軟雅黑', 20), bg=('#96CDCD'), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ?x='X!': buttonClick1(x)) ? ? ? ? btnx.place(x=0, y=220, width=60, height=45) ? ? ? ? btn7.destroy() ? ? ? ? btn71 = tkinter.Button(root, text='7', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='7': buttonClick1(x)) ? ? ? ? btn71.place(x=60, y=220, width=60, height=45) ? ? ? ? btn8.destroy() ? ? ? ? btn81 = tkinter.Button(root, text='8', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='8': buttonClick1(x)) ? ? ? ? btn81.place(x=120, y=220, width=60, height=45) ? ? ? ? btn9.destroy() ? ? ? ? btn91 = tkinter.Button(root, text='9', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='9': buttonClick1(x)) ? ? ? ? btn91.place(x=180, y=220, width=60, height=45) ? ? ? ? btnsub.destroy() ? ? ? ? btnsub1 = tkinter.Button(root, text='-', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='-': buttonClick1(x)) ? ? ? ? btnsub1.place(x=240, y=220, width=60, height=45) ? ? ? ? # 第五行 ? ? ? ? btn4x = tkinter.Button(root, text='1/X', font=('微軟雅黑', 20), bg=('#96CDCD'), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='1/X': buttonClick1(x)) ? ? ? ? btn4x.place(x=0, y=265, width=60, height=45) ? ? ? ? btn4.destroy() ? ? ? ? btn41 = tkinter.Button(root, text='4', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='4': buttonClick1(x)) ? ? ? ? btn41.place(x=60, y=265, width=60, height=45) ? ? ? ? btn5.destroy() ? ? ? ? btn51 = tkinter.Button(root, text='5', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='5': buttonClick1(x)) ? ? ? ? btn51.place(x=120, y=265, width=60, height=45) ? ? ? ? btn6.destroy() ? ? ? ? btn61 = tkinter.Button(root, text='6', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='6': buttonClick1(x)) ? ? ? ? btn61.place(x=180, y=265, width=60, height=45) ? ? ? ? btnadd.destroy() ? ? ? ? btnadd1 = tkinter.Button(root, text='×', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='×': buttonClick1(x)) ? ? ? ? btnadd1.place(x=240, y=265, width=60, height=45) ? ? ? ? # 第六行 ? ? ? ? btnpi = tkinter.Button(root, text='π', font=('微軟雅黑', 20), bg=('#96CDCD'), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='π': buttonClick1(x)) ? ? ? ? btnpi.place(x=0, y=310, width=60, height=45) ? ? ? ? btnpi.flash() ? ? ? ? btn1.destroy() ? ? ? ? btn11 = tkinter.Button(root, text='1', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='1': buttonClick1(x)) ? ? ? ? btn11.place(x=60, y=310, width=60, height=45) ? ? ? ? btn2.destroy() ? ? ? ? btn21 = tkinter.Button(root, text='2', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='2': buttonClick1(x)) ? ? ? ? btn21.place(x=120, y=310, width=60, height=45) ? ? ? ? btn3.destroy() ? ? ? ? btn31 = tkinter.Button(root, text='3', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='3': buttonClick1(x)) ? ? ? ? btn31.place(x=180, y=310, width=60, height=45) ? ? ? ? btnechu.destroy() ? ? ? ? btnechu1 = tkinter.Button(root, text='÷', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='÷': buttonClick1(x)) ? ? ? ? btnechu1.place(x=240, y=310, width=60, height=45) ? ? ? ? # 第七行 ? ? ? ? btnperr = tkinter.Button(root, text='低級', font=('微軟雅黑', 20), fg='orange', bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? command=lambda x='低級': buttonClick1(x)) ? ? ? ? btnperr.place(x=0, y=355, width=60, height=45) ? ? ? ? btnper.destroy() ? ? ? ? btnper1 = tkinter.Button(root, text='e', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? command=lambda x='e': buttonClick1(x)) ? ? ? ? btnper1.place(x=60, y=355, width=60, height=45) ? ? ? ? btn0.destroy() ? ? ? ? btn01 = tkinter.Button(root, text='0', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='0': buttonClick1(x)) ? ? ? ? btn01.place(x=120, y=355, width=60, height=45) ? ? ? ? btnpoint.destroy() ? ? ? ? btnpoint1 = tkinter.Button(root, text='.', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? x='.': buttonClick1(x)) ? ? ? ? btnpoint1.place(x=180, y=355, width=60, height=45) ? ? ? ? btnequ.destroy() ? ? ? ? btnequ1 = tkinter.Button(root, text='=', bg='orange', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? command=lambda x='=': buttonClick1(x)) ? ? ? ? btnequ1.place(x=240, y=355, width=60, height=45)
7.高級頁面的響應(yīng)事件的處理
先來說明一下計算器計算某個表達式用到的原理:
比如要計算這個表達式:2+3*(sin(0)+lg(10))-2
1.首先用正則表達式對這個字符串處理,計算出sin(0)=0,字符串變?yōu)椋?+3*(0+lg(10))-2
2.再用正則表達式處理字符串,計算出lg(10)=1,字符串變?yōu)椋?+3*(0+1)-2
3.再用正則表達式處理字符串,計算括號(0+1) =1,此時字符串變成:3+3*1-2
4.四則運算直接調(diào)用python自帶的函數(shù)eval()直接計算結(jié)果。
筆者用此思想來實現(xiàn)下述高級頁面表達式的計算。
【注】:重要實現(xiàn)的要點說明
1.高級頁面依然保留初級頁面所有布局、功能,在此基礎(chǔ)上增加了很多新功能。
2.在高級頁面輸完表達式,當(dāng)我們點擊‘=’時,計算某個表達式值。用到上述思想。
3.我們以計算一個表達式中含有sin(x)為例來進行簡單的說明:
(1)我們首先判斷sin是不是在某個表達式中。
(2)使用正則表達式:strsin = r’sin(\d+)|sin(-?\d+.\d+)‘來提取如相應(yīng)的表達式。
(3) 此時得到是一個字符串表達式’sin(2)’,我們再用正則表達式提取里面的數(shù)字value。調(diào)用math庫里面是sin函數(shù)。來計算sin(2), 如:value = str(sin_t(float(value))) 這里的sin_t()是一個自定義函數(shù)。在下述functions.py文件里面。
(4)此時我們將計算得到的數(shù)值,調(diào)用replace() 進行替換。就能達到想要的效果了哦。
別的表達式都是用的同樣的方法,這里不再贅述。請讀者根據(jù)源代碼自行體會。
def buttonClick1(btn): ? ? content = contentVar.get() ? ? ? ? ? ? if content.startswith('.'): ?# 小數(shù)點前加0 ? ? ? ? ? ? ? ? content = '0' + content ? ? ? ? ? ? if btn in '0123456789()': ? ? ? ? ? ? ? ? content += btn ? ? ? ? ? ? elif btn == '.': ? ? ? ? ? ? ? ? lastPart = re.split(r'\+|-|\*|/', content)[-1] ? ? ? ? ? ? ? ? if '.' in lastPart: ? ? ? ? ? ? ? ? ? ? tk.messagebox.showerror('錯誤', 'Input Error') ? ? ? ? ? ? ? ? ? ? return ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? content += btn ? ? ? ? ? ? elif btn == '^': ? ? ? ? ? ? ? ? n = content.split('.') ? ? ? ? ? ? ? ? if all(map(lambda x: x.isdigit(), n)): ? ? ? ? ? ? ? ? ? ? content = eval(content) * eval(content) ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? tk.messagebox.showerror('錯誤', 'Input Error') ? ? ? ? ? ? ? ? ? ? return ? ? ? ? ? ? elif btn == 'AC': ? ? ? ? ? ? ? ? content = '' ? ? ? ? ? ? elif btn == '=': ? ? ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? ? ? for operat in content: ? ? ? ? ? ? ? ? ? ? ? ? if operat == '÷': ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace('÷', '/') ? ? ? ? ? ? ? ? ? ? ? ? elif operat == '×': ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace('×', '*') ? ? ? ? ? ? ? ? ? ? ? ? elif operat == '^': ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace('^', '**') ? ? ? ? ? ? ? ? ? ? strsin = r'sin\(\d+\)|sin\(\-?\d+\.\d+\)' ? ? ? ? ? ? ? ? ? ? if 'sin' in content: ? ? ? ? ? ? ? ? ? ? ? ? m = re.search(strsin, content) ? ? ? ? ? ? ? ? ? ? ? ? if m is not None: ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = m.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange1 = exchange ? ? ? ? ? ? ? ? ? ? ? ? ? ? if '.' in exchange: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+\.\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(sin_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(sin_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? strcos = r'cos\(\d+\)|cos\(\-?\d+\.\d+\)' ? ? ? ? ? ? ? ? ? ? if 'cos' in content: ? ? ? ? ? ? ? ? ? ? ? ? m = re.search(strcos, content) ? ? ? ? ? ? ? ? ? ? ? ? if m is not None: ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = m.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange1 = exchange ? ? ? ? ? ? ? ? ? ? ? ? ? ? if '.' in exchange: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+\.\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(cos_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(cos_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? strtan = r'tan\(\d+\)|tan\(\-?\d+\.\d+\)' ? ? ? ? ? ? ? ? ? ? if 'tan' in content: ? ? ? ? ? ? ? ? ? ? ? ? m = re.search(strtan, content) ? ? ? ? ? ? ? ? ? ? ? ? if m is not None: ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = m.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange1 = exchange ? ? ? ? ? ? ? ? ? ? ? ? ? ? if '.' in exchange: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+\.\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(tan_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(tan_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? strsec = r'sec\(\-?\d+\)|sec\(\-?\d+\.\d+\)' ? ? ? ? ? ? ? ? ? ? if 'sec' in content: ? ? ? ? ? ? ? ? ? ? ? ? m = re.search(strsec, content) ? ? ? ? ? ? ? ? ? ? ? ? if m is not None: ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = m.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange1 = exchange ? ? ? ? ? ? ? ? ? ? ? ? ? ? if '.' in exchange: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+\.\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(sec_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(sec_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? strcsc = r'csc\(\d+\)' ? ? ? ? ? ? ? ? ? ? if 'csc' in content: ? ? ? ? ? ? ? ? ? ? ? ? m = re.search(strcsc, content) ? ? ? ? ? ? ? ? ? ? ? ? if m is not None: ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = m.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange1 = exchange ? ? ? ? ? ? ? ? ? ? ? ? ? ? if '.' in exchange: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+\.\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(csc_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(csc_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? strlg = r'lg\(\-?\d+\)|lg\(\-?\d+\.\d+\)' ? ? ? ? ? ? ? ? ? ? if 'lg' in content: ? ? ? ? ? ? ? ? ? ? ? ? m = re.search(strlg, content) ? ? ? ? ? ? ? ? ? ? ? ? if m is not None: ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = m.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange1 = exchange ? ? ? ? ? ? ? ? ? ? ? ? ? ? if '.' in exchange: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+\.\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if float(value) <= 0: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tk.messagebox.showerror('錯誤', 'FORMAT ERROR') ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(lg_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if int(value)<=0 : ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tk.messagebox.showerror('錯誤', 'FORMAT ERROR') ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(lg_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? strln = r'ln\(\-?\d+\)|ln\(\-?\d+\.\d+\)' ? ? ? ? ? ? ? ? ? ? if 'ln' in content: ? ? ? ? ? ? ? ? ? ? ? ? m = re.search(strln, content) ? ? ? ? ? ? ? ? ? ? ? ? if m is not None: ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = m.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange1 = exchange ? ? ? ? ? ? ? ? ? ? ? ? ? ? if '.' in exchange: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+\.\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if float(value) <= 0: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tk.messagebox.showerror('錯誤', 'FORMAT ERROR') ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(ln_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exchange = re.search("\-?\d+", exchange) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = exchange.group() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if int(value) <= 0: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tk.messagebox.showerror('錯誤', 'FORMAT ERROR') ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = str(ln_t(float(value))) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? content = content.replace(exchange1, value) ? ? ? ? ? ? ? ? ? ? value = eval(content) ? ? ? ? ? ? ? ? ? ? content = str(round(value, 10)) ? ? ? ? ? ? ? ? except ZeroDivisionError: ? ? ? ? ? ? ? ? ? ? tk.messagebox.showerror('錯誤', 'VALUE ERROR') ? ? ? ? ? ? ? ? ? ? return ? ? ? ? ? ? elif btn in operators: ? ? ? ? ? ? ? ? if content.endswith(operators): ? ? ? ? ? ? ? ? ? ? tk.messagebox.showerror('錯誤', 'FORMAT ERROR') ? ? ? ? ? ? ? ? ? ? return ? ? ? ? ? ? ? ? content += btn ? ? ? ? ? ? elif btn == 'e': ? ? ? ? ? ? ? ? content = 2.7182818284 ? ? ? ? ? ? elif btn == 'π': ? ? ? ? ? ? ? ? content = 3.1415926535 ? ? ? ? ? ? elif btn == '1/X': ? ? ? ? ? ? ? ? content = reciprocal(float(content)) ? ? ? ? ? ? elif btn == 'X!': ? ? ? ? ? ? ? ? content = factorial(int(content)) ? ? ? ? ? ? elif btn == 'x^y': ? ? ? ? ? ? ? ? content += '^' ? ? ? ? ? ? elif btn == 'sin': ? ? ? ? ? ? ? ? content += 'sin(' ? ? ? ? ? ? elif btn == 'cos': ? ? ? ? ? ? ? ? content += 'cos(' ? ? ? ? ? ? elif btn == 'tan': ? ? ? ? ? ? ? ? content += 'tan(' ? ? ? ? ? ? elif btn == 'sec': ? ? ? ? ? ? ? ? content += 'sec(' ? ? ? ? ? ? elif btn == 'csc': ? ? ? ? ? ? ? ? content += 'csc(' ? ? ? ? ? ? elif btn == 'lg': ? ? ? ? ? ? ? ? content += 'lg(' ? ? ? ? ? ? elif btn == 'ln': ? ? ? ? ? ? ? ? content += 'ln(' ? ? ? ? ? ? elif btn == '←': ?# 如果按下的是退格‘',則選取當(dāng)前數(shù)字第一位到倒數(shù)第二位 ? ? ? ? ? ? ? ? content = content[0:-1]
8.高級頁面中低級按鈕實現(xiàn)
這里還是用到的同樣思想。對所有的高級按鈕全部銷毀。重新布局新的按鈕。這里不再贅述。
elif btn == '低級': ? ?contentEntry.place(x=0, y=110, width=300, height=40) ? ? ? ? ? ? ? ? #第一行 ? ? ? ? ? ? ? ? btncsc.destroy() ? ? ? ? ? ? ? ? btnrad.destroy() ? ? ? ? ? ? ? ? btnsin.destroy() ? ? ? ? ? ? ? ? btncos.destroy() ? ? ? ? ? ? ? ? btntan.destroy() ? ? ? ? ? ? ? ? # 第二行 ? ? ? ? ? ? ? ? btnxsec.destroy() ? ? ? ? ? ? ? ? btnlog.destroy() ? ? ? ? ? ? ? ? btnln.destroy() ? ? ? ? ? ? ? ? btnleft.destroy() ? ? ? ? ? ? ? ? btnrigh.destroy() ? ? ? ? ? ? ? ? # 第三行 ? ? ? ? ? ? ? ? btnaxy.destroy() ? ? ? ? ? ? ? ? btnac1.destroy() ? ? ? ? ? ? ? ? btnback1.destroy() ? ? ? ? ? ? ? ? btndivi1.destroy() ? ? ? ? ? ? ? ? btnmul1.destroy() ? ? ? ? ? ? ? ? # 第四行 ? ? ? ? ? ? ? ? btnx.destroy() ? ? ? ? ? ? ? ? btn71.destroy() ? ? ? ? ? ? ? ? btn81.destroy() ? ? ? ? ? ? ? ? btn91.destroy() ? ? ? ? ? ? ? ? btnsub1.destroy() ? ? ? ? ? ? ? ? # 第五行 ? ? ? ? ? ? ? ? btn4x.destroy() ? ? ? ? ? ? ? ? btn41.destroy() ? ? ? ? ? ? ? ? btn51.destroy() ? ? ? ? ? ? ? ? btn61.destroy() ? ? ? ? ? ? ? ? btnadd1.destroy() ? ? ? ? ? ? ? ? # 第六行 ? ? ? ? ? ? ? ? btnpi.destroy() ? ? ? ? ? ? ? ? btn11.destroy() ? ? ? ? ? ? ? ? btn21.destroy() ? ? ? ? ? ? ? ? btn31.destroy() ? ? ? ? ? ? ? ? btnechu1.destroy() ? ? ? ? ? ? ? ? # 第七行 ? ? ? ? ? ? ? ? btnperr.destroy() ? ? ? ? ? ? ? ? btnper1.destroy() ? ? ? ? ? ? ? ? btn01.destroy() ? ? ? ? ? ? ? ? btnpoint1.destroy() ? ? ? ? ? ? ? ? btnequ1.destroy() ? ? ? ? ? ? ? ? # 第一行 ? ? ? ? ? ? ? ? btnac = tkinter.Button(root, text='AC', bd=0.5, font=('黑體', 20), fg='orange', command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='AC': buttonClick(x)) ? ? ? ? ? ? ? ? btnac.flash() ? ? ? ? ? ? ? ? btnac.place(x=0, y=150, width=75, height=50) ? ? ? ? ? ? ? ? btnback = tkinter.Button(root, text='←', font=('微軟雅黑', 20), fg='#4F4F4F', bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='←': buttonClick(x)) ? ? ? ? ? ? ? ? btnback.place(x=75, y=150, width=75, height=50) ? ? ? ? ? ? ? ? btndivi = tkinter.Button(root, text='^', font=('微軟雅黑', 20), fg='#4F4F4F', bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='^': buttonClick(x)) ? ? ? ? ? ? ? ? btndivi.place(x=150, y=150, width=75, height=50) ? ? ? ? ? ? ? ? btnmul = tkinter.Button(root, text='+', font=('微軟雅黑', 20), fg="#4F4F4F", bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='+': buttonClick(x)) ? ? ? ? ? ? ? ? btnmul.place(x=225, y=150, width=75, height=50) ? ? ? ? ? ? ? ? # 第二行 ? ? ? ? ? ? ? ? btn7 = tkinter.Button(root, text='7', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='7': buttonClick(x)) ? ? ? ? ? ? ? ? btn7.place(x=0, y=200, width=75, height=50) ? ? ? ? ? ? ? ? btn8 = tkinter.Button(root, text='8', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='8': buttonClick(x)) ? ? ? ? ? ? ? ? btn8.place(x=75, y=200, width=75, height=50) ? ? ? ? ? ? ? ? btn9 = tkinter.Button(root, text='9', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='9': buttonClick(x)) ? ? ? ? ? ? ? ? btn9.place(x=150, y=200, width=75, height=50) ? ? ? ? ? ? ? ? btnsub = tkinter.Button(root, text='-', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='-': buttonClick(x)) ? ? ? ? ? ? ? ? btnsub.place(x=225, y=200, width=75, height=50) ? ? ? ? ? ? ? ? # 第三行 ? ? ? ? ? ? ? ? btn4 = tkinter.Button(root, text='4', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='4': buttonClick(x)) ? ? ? ? ? ? ? ? btn4.place(x=0, y=250, width=75, height=50) ? ? ? ? ? ? ? ? btn5 = tkinter.Button(root, text='5', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='5': buttonClick(x)) ? ? ? ? ? ? ? ? btn5.place(x=75, y=250, width=75, height=50) ? ? ? ? ? ? ? ? btn6 = tkinter.Button(root, text='6', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='6': buttonClick(x)) ? ? ? ? ? ? ? ? btn6.place(x=150, y=250, width=75, height=50) ? ? ? ? ? ? ? ? btnadd = tkinter.Button(root, text='×', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='×': buttonClick(x)) ? ? ? ? ? ? ? ? btnadd.place(x=225, y=250, width=75, height=50) ? ? ? ? ? ? ? ? # 第四行 ? ? ? ? ? ? ? ? btn1 = tkinter.Button(root, text='1', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='1': buttonClick(x)) ? ? ? ? ? ? ? ? btn1.place(x=0, y=300, width=75, height=50) ? ? ? ? ? ? ? ? btn2 = tkinter.Button(root, text='2', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='2': buttonClick(x)) ? ? ? ? ? ? ? ? btn2.place(x=75, y=300, width=75, height=50) ? ? ? ? ? ? ? ? btn3 = tkinter.Button(root, text='3', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='3': buttonClick(x)) ? ? ? ? ? ? ? ? btn3.place(x=150, y=300, width=75, height=50) ? ? ? ? ? ? ? ? btnechu = tkinter.Button(root, text='÷', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='÷': buttonClick(x)) ? ? ? ? ? ? ? ? btnechu.place(x=225, y=300, width=75, height=50) ? ? ? ? ? ? ? ? # 第五行 ? ? ? ? ? ? ? ? btnper = tkinter.Button(root, text='高級', font=('微軟雅黑', 20), fg='orange', bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? command=lambda x='高級': buttonClick(x)) ? ? ? ? ? ? ? ? btnper.place(x=0, y=350, width=75, height=50) ? ? ? ? ? ? ? ? btn0 = tkinter.Button(root, text='0', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='0': buttonClick(x)) ? ? ? ? ? ? ? ? btn0.place(x=75, y=350, width=75, height=50) ? ? ? ? ? ? ? ? btnpoint = tkinter.Button(root, text='.', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, command=lambda \ ? ? ? ? ? ? ? ? ? ? ? ? x='.': buttonClick(x)) ? ? ? ? ? ? ? ? btnpoint.place(x=150, y=350, width=75, height=50) ? ? ? ? ? ? ? ? btnequ = tkinter.Button(root, text='=', bg='orange', font=('微軟雅黑', 20), fg=('#4F4F4F'), bd=0.5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? command=lambda x='=': buttonClick(x)) ? ? ? ? ? ? ? ? btnequ.place(x=225, y=350, width=75, height=50) ? ? ? ? ? ? contentVar.set(content) ? ? contentVar.set(content)
9.運行代碼
這里所有的代碼以及完成。最后還差個functions.py源碼啦。
operators = ('÷', '×', '-', '+', '=', '.') root.mainloop()
10.functions.py實現(xiàn)
本來筆者想要用泰勒公式來計算復(fù)雜的表達式。但是沒有得到想要的結(jié)果。直接調(diào)用math庫啦,感興趣的讀者可以嘗試用泰勒公式計算
#!/usr/bin/env python __author__: "Jhze dnowz" import math # 計算機倒數(shù) def reciprocal(value): ? ? value = round(float(1) / (float(value)), 10) ? ? return value # 計算階乘 def factorial(value): ? ? sum = 1 ? ? if value==0 or value==1: ? ? ? ? sum =1 ? ? for i in range(value): ? ? ? ? sum += sum * i ? ? return sum # 計算sin # def sin(x): # ? ? e = 10^(-15) # ? ? sum = 0 # ? ? evl = x # ? ? n = 1 # ? ? while(abs(evl)>e): # ? ? ? ? sum = sum+evl # ? ? ? ? a = (-1)**n # ? ? ? ? b = evl**(2*n+1) # ? ? ? ? c = factorial((2*n+1)) # ? ? ? ? evl = a*b/c # ? ? ? ? n +=1 # # print(sin(1)) # 計算sin def sin_t(x): ? ? return round(math.sin(x),10) # 計算cos def cos_t(x): ? ? return round(math.cos(x), 10) # 計算tan def tan_t(x): ? ? return round(math.tan(x), 10) # 計算csc def csc_t(x): ? ? return round(float(1)/math.sin(x), 10) # 計算sec def sec_t(x): ? ? return round(float(1)/math.cos(x), 10) # 計算lg def lg_t(x): ? ? return round(math.log10(x), 10) # 計算ln def ln_t(x): ? ? return round(math.log(x, math.e), 10)
11.相關(guān)效果圖
12.動態(tài)效果圖
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
pycharm中導(dǎo)入模塊錯誤時提示Try to run this command from the system ter
這篇文章主要介紹了pycharm中導(dǎo)入模塊錯誤時提示Try to run this command from the system terminal問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03python利用logging模塊實現(xiàn)根據(jù)日志級別打印不同顏色日志的代碼案例
這篇文章主要介紹了python利用logging模塊實現(xiàn)根據(jù)日志級別打印不同顏色日志,本文通過實例代碼給大家詳細講解,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12python使用for循環(huán)計算0-100的整數(shù)的和方法
今天小編就為大家分享一篇python使用for循環(huán)計算0-100的整數(shù)的和方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02Python seek()和tell()函數(shù)的具體使用
本文主要介紹了Python seek()和tell()函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02