#python中的import語句是用來導(dǎo)入模塊的,在python模塊庫中有著大量的模塊可供使用,要想使用這些文件需要用import語句把指定模塊導(dǎo)入到當(dāng)前程序中。
import re #處理字符串的模塊,如查找特定字符,刪除特定字符,字符串分割等
import tkinter #Tkinter模塊("Tk 接口")是Python的標(biāo)準(zhǔn)Tk GUI工具包的接口,位Python的內(nèi)置模塊,直接import tkinter即可使用。
import tkinter.messagebox #調(diào)用tkinter模塊中的messagebox函數(shù),這個是消息框,對話框的關(guān)鍵,會彈出一個小框
#按鈕操作,點(diǎn)擊按鈕后需要做的處理
def buttonClik(btn):
content = contentVar.get() #獲取文本框中的內(nèi)容
#如果已有內(nèi)容是以小數(shù)點(diǎn)開頭的,在前面加0
if content.startswith( '.' ):
content = '0' + content #字符串可以直接用+來增加字符
#根據(jù)不同的按鈕作出不同的反應(yīng)
if btn in '0123456789' :
content + = btn #0-9中哪個鍵按下了,就在content字符串中增添
elif btn = = '.' :
#re.split,支持正則及多個字符切割
lastPart = re.split(r '\+|-|\*|/' ,content)[ - 1 ] #將content從+-*/這些字符的地方分割開來,[-1]表示獲取最后一個字符
if '.' in lastPart:
tkinter.messagebox.showerror( '錯誤' , '重復(fù)出現(xiàn)的小數(shù)點(diǎn)' ) #出現(xiàn)對話框,并提示信息
return
else :
content + = btn
elif btn = = 'C' :
content = '' #清除文本框
elif btn = = '=' :
try :
#對輸入的表達(dá)式求值
content = str ( eval (content)) #調(diào)用函數(shù)eval,用字符串計算出結(jié)果
except :
tkinter.messagebox.showerror( '錯誤' , '表達(dá)式有誤' )
return
elif btn in operators:
if content.endswith(operators): #如果content中最后出現(xiàn)的+-*/
tkinter.messagebox.showerror( '錯誤' , '不允許存在連續(xù)運(yùn)算符' )
return
content + = btn
elif btn = = 'Sqrt' :
n = content.split( '.' ) #從.處分割存入n,n是一個列表
if all ( map ( lambda x:x.isdigit(),n)): #如果列表中所有的都是數(shù)字,就是為了檢查表達(dá)式是不是正確的
content = eval (content) * * 0.5
else :
tkinter.messagebox.showerror( '錯誤' , '表達(dá)式錯誤' )
return
contentVar. set (content) #將結(jié)果顯示到文本框中
root = tkinter.Tk() #生成主窗口,用root表示,后面就在root操作
#設(shè)置窗口大小和位置可直接聯(lián)系客服QQ交代需求:953586085
歡迎光臨程序代寫小店https: / / item.taobao.com / item.htm?spm = a230r. 1.14 . 59.255028c3ALNkZ0 & id = 586797758241 &ns = 1 &abbucket = 15 #detail
root.geometry( '300x270+400+100' ) #指定主框體大小
#不允許改變窗口大小
root.resizable( False , False ) #框體大小可調(diào)性,分別表示x,y方向的可變性;
#設(shè)置窗口標(biāo)題
root.title( '計算器' )
#文本框和按鈕都是tkinter中的組件
#Entry 文本框(單行);
#Button 按鈕;
#放置用來顯示信息的文本框,設(shè)置為只讀
#tkinter.StringVar 能自動刷新的字符串變量,可用set和get方法進(jìn)行傳值和取值
contentVar = tkinter.StringVar(root,'')
contentEntry = tkinter.Entry(root,textvariable = contentVar) #括號里面,可見第一個都是root,即表示都是以root為主界面的,將文本框中的內(nèi)容存在contentVar中
contentEntry[ 'state' ] = 'readonly' #文本框只能讀,不能寫
contentEntry.place(x = 10 ,y = 10 ,width = 280 ,height = 20 ) #文本框在root主界面的xy坐標(biāo)位置,以及文本框自生的寬和高
#x: 組件左上角的x坐標(biāo);
#y: 組件右上角的y坐標(biāo);
#放置清除按鈕和等號按鈕
btnClear = tkinter.Button(root,text = 'C' ,bg = 'red' ,command = lambda :buttonClik( 'C' )) #在root主界面中放置按鈕,按鈕上顯示C,紅色,點(diǎn)擊按鈕后進(jìn)入buttonClik回調(diào)函數(shù)做進(jìn)一步的處理,注意傳入了參數(shù)‘C’,這樣就能分清是哪個按鈕按下了
#下面的內(nèi)容和上面的模式都是一樣的
btnClear.place(x = 40 ,y = 40 ,width = 80 ,height = 20 )
btnCompute = tkinter.Button(root,text = '=' ,bg = 'yellow' ,command = lambda :buttonClik( '=' ))
btnCompute.place(x = 170 ,y = 40 ,width = 80 ,height = 20 )
#放置10個數(shù)字、小數(shù)點(diǎn)和計算平方根的按鈕
digits = list ( '0123456789.' ) + [ 'Sqrt' ] #序列l(wèi)ist是Python中最基本的數(shù)據(jù)結(jié)構(gòu)。序列中的每個元素都分配一個數(shù)字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推。
index = 0
#用循環(huán)的方式將上面數(shù)字、小數(shù)點(diǎn)、平方根這12個按鈕分成四行三列進(jìn)行放置
for row in range ( 4 ):
for col in range ( 3 ):
d = digits[index] #按索引從list中取值,和c語言中的數(shù)組類似
index + = 1 #索引號遞增
btnDigit = tkinter.Button(root,text = d,command = lambda x = d:buttonClik(x)) #和上面的是類似的
btnDigit.place(x = 20 + col * 70 ,y = 80 + row * 50 ,width = 50 ,height = 20 ) #很顯然,每次放一個按鈕的位置是不一樣的,但是它們之間的關(guān)系時確定的
#放置運(yùn)算符按鈕
operators = ( '+' , '-' , '*' , '/' , '**' , '//' ) #Python的元組與列表類似,不同之處在于元組的元素不能修改。
#元組使用小括號,列表使用方括號。
#enumerate() 函數(shù)用于將一個可遍歷的數(shù)據(jù)對象(如列表、元組或字符串)組合為一個索引序列,同時列出數(shù)據(jù)和數(shù)據(jù)下標(biāo),一般用在 for 循環(huán)當(dāng)中。
for index,operator in enumerate (operators):
btnOperator = tkinter.Button(root,text = operator,bg = 'orange' ,command = lambda x = operator:buttonClik(x)) #創(chuàng)建的過程和上面類似
btnOperator.place(x = 230 ,y = 80 + index * 30 ,width = 50 ,height = 20 )
root.mainloop() #進(jìn)入消息循環(huán)(必需組件)
|