亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何利用python的tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算器

 更新時(shí)間:2021年04月21日 09:24:01   作者:豪·  
這篇文章主要給大家介紹了關(guān)于如何利用python的tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

做一個(gè)計(jì)算器,這是我想要達(dá)成的效果:

在按下按鈕或者按下鍵盤的時(shí)候,第一行輸入框會(huì)顯示輸入的內(nèi)容,第二行顯示框則會(huì)預(yù)覽運(yùn)算結(jié)果,如果發(fā)生異常,輸入內(nèi)容格式錯(cuò)誤,無(wú)法計(jì)算,則顯示框顯示“錯(cuò)誤”。

按“=”按鈕或按鍵回車計(jì)算結(jié)果,結(jié)果顯示在第一行。

1.準(zhǔn)備工作

導(dǎo)入庫(kù) tkinter

import tkinter as tk

2. 開始

定義兩個(gè)變量:

equal_is=False      #定義一些變量
textchange=''

equal_is 用于判斷是否已經(jīng)計(jì)算出結(jié)果,textchange是用于設(shè)置輸入框的內(nèi)容。

2.1 生成控件

首先生成窗體:

root=tk.Tk()        #創(chuàng)建窗體
root.geometry('250x350')
root.title('計(jì)算器')

為了方便,在這里定義一個(gè)函數(shù) create_btn

def create_btn(text,col,row,cs,rs,pri='',px=(1,1),py=(1,1)):   #函數(shù):生成按鈕
    if pri=='':
        t=text
    else:
        t=pri
    a=tk.Button(root,text=text,width=4,command=lambda:(text_print(t)))	#輸入內(nèi)容
    a.grid(column=col,row=row,columnspan=cs,rowspan=rs,padx=px,pady=py,sticky='nswe')
    return(a)

因?yàn)橛行┌粹o的輸入內(nèi)容并不等于它的文本內(nèi)容(比如按鈕“×”,輸入“*”),因此我們?cè)O(shè)置一個(gè)空的參數(shù) pri ,在 pri 沒(méi)有被賦值的時(shí)候,輸入內(nèi)容則為 text 。

text_print 是輸入內(nèi)容的函數(shù),這個(gè)在后面會(huì)定義。

btn={}                                  #生成按鈕
btn['1']=create_btn('1',0,5,1,1)
btn['2']=create_btn('2',1,5,1,1)
btn['3']=create_btn('3',2,5,1,1)
btn['4']=create_btn('4',0,4,1,1)
btn['5']=create_btn('5',1,4,1,1)
btn['6']=create_btn('6',2,4,1,1)
btn['7']=create_btn('7',0,3,1,1)
btn['8']=create_btn('8',1,3,1,1)
btn['9']=create_btn('9',2,3,1,1)
btn['0']=create_btn('0',0,6,2,1)

btn['.']=create_btn('.',2,6,1,1)
btn['=']=create_btn('=',4,5,1,2)
btn['+']=create_btn('+',3,6,1,1)
btn['-']=create_btn('-',3,5,1,1)
btn['*']=create_btn('×',3,4,1,1,pri='*')
btn['/']=create_btn('÷',4,4,1,1,pri='/')
btn['←']=create_btn('←',1,2,1,1)

btn['C']=create_btn('C',2,2,1,1)
btn['(']=create_btn('(',3,2,1,1)
btn[')']=create_btn(')',4,2,1,1)
btn['**2']=create_btn('x²',3,3,1,1,pri='**2')
btn['**(-1)']=create_btn('1/x',4,3,1,1,pri='**(-1)')

上面是用 create_btn 函數(shù)生成每一個(gè)按鈕。

la=tk.Label(root,text='',bg='white',fg='black',font=('宋體',24),anchor='w',relief='flat')  #生成輸入框
la.grid(column=0,row=0,columnspan=5,rowspan=1,sticky='we')

lab=tk.Label(root,bg='white',fg='grey',height=1,font=('宋體',22),anchor='w',relief='flat')    #生成顯示框
lab.grid(column=0,row=1,columnspan=5,rowspan=1,sticky='we')

上面創(chuàng)建兩個(gè)標(biāo)簽,作為輸入框和顯示框。

la 是輸入框,lab是顯示框。

然后定義函數(shù) grid_rowconfigure 和 grid_columnconfigure,用于自動(dòng)填充行和列:

def grid_rowconfigure(*rows):   #函數(shù)填充行。*rows:允許接收多個(gè)參數(shù)
    for i in rows:
        root.grid_rowconfigure(i,weight=1)
        
def grid_columnconfigure(*cols):    #函數(shù)填充列。*cols:允許接收多個(gè)參數(shù)
    for i in cols:
        root.grid_columnconfigure(i,weight=1)

在窗體被改變大小時(shí),按鈕會(huì)自動(dòng)填充四周,而輸入、顯示框只填充左右兩邊(第2,3,4,5,6行會(huì)向豎直方向填充,每一列都會(huì)向水平方向填充)。

grid_rowconfigure(2,3,4,5,6)
grid_columnconfigure(0,1,2,3,4)

2.2 定義輸入和計(jì)算函數(shù)

定義 text_print 函數(shù),當(dāng)按鈕被點(diǎn)擊時(shí)輸入內(nèi)容,當(dāng)按鈕“=”被點(diǎn)擊的時(shí)候計(jì)算結(jié)果:

def text_print(x):  #函數(shù)按鈕輸入算式
    global textchange,equal_is	#聲明全局變量
    if x!='=':
        if x=='←':
            a=str(textchange)[0:-1]
            textchange=a	#退格
        elif x=='C':
            textchange=''	#清空
        else:
            textchange=str(textchange)+str(x)	#輸入
        la.configure(text=textchange)
        show_is()
        equal_is=False	#判斷格式有無(wú)錯(cuò)誤
    if x=='=':
        text_equal()	#計(jì)算結(jié)果

show_is 用于判斷格式有無(wú)錯(cuò)誤:

def show_is():     #顯示框內(nèi)容
    global textchange	#聲明全局變量
    if textchange!='':
        try:
            textshow=eval(textchange)
        except (SyntaxError,TypeError,NameError):
            lab.configure(text='錯(cuò)誤')	#如果出錯(cuò)了,則顯示“錯(cuò)誤”
        else:
            lab.configure(text=textshow)	#如果沒(méi)有出錯(cuò),則顯示結(jié)果
    else:
        lab.configure(text='')	#如果輸入框?yàn)榭?,那么清空顯示框

text_equal 是計(jì)算結(jié)果的函數(shù):

def text_equal(event=None):   #函數(shù)計(jì)算結(jié)果并上到輸入框
    global textchange,equal_is	#聲明全局變量
    if lab['text']!='錯(cuò)誤' and equal_is==False:
        textchange=lab['text']	#無(wú)格式錯(cuò)誤時(shí),計(jì)算結(jié)果
        la.configure(text=textchange)	#輸入框顯示結(jié)果
        lab.configure(text='')	#清空顯示框
        equal_is=True

這里詳細(xì)說(shuō)明一下 equal_is 的作用:

因?yàn)橛?jì)算了結(jié)果后顯示框會(huì)清空,為了防止二次計(jì)算導(dǎo)致輸入框也跟著清空,我們需要判斷是否已經(jīng)計(jì)算過(guò)結(jié)果,這時(shí)就用到變量 equal_is 。

當(dāng)輸入內(nèi)容時(shí),equal_is 變?yōu)?True,計(jì)算結(jié)果后,equal_is 變?yōu)?False,如果 equal_is == True,則不計(jì)算結(jié)果。

2.3 綁定鍵盤事件

我設(shè)置的鍵盤按鍵及其對(duì)應(yīng)輸入內(nèi)容:

輸入內(nèi)容 對(duì)應(yīng)按鍵
0~9 0~9
+ +
- -
* *
/ /
退格 BackSpace
清空 Delete
計(jì)算結(jié)果 Return(Enter鍵)

定義一個(gè)函數(shù) bind_print,跟 text_print 有點(diǎn)相似,但有些不一樣(原諒我技術(shù)差,不知道別的方法,只能重新定義一個(gè)函數(shù)):

def bind_print(event):  #函數(shù)鍵盤事件輸入算式
    global textchange,equal_is
    if event.keysym!='Return':
        if event.keysym=='BackSpace':	#如果按鍵名等于“BackSpace”(退格鍵),那么就退格
            a=str(textchange)[0:-1]
            textchange=a
        elif event.keysym=='Delete':	#清空
            textchange=''
        else:
            textchange=str(textchange)+str(event.char)	#輸入按鍵內(nèi)容,char不會(huì)獲得Ctrl,Shift等特殊按鍵的文本
        la.configure(text=textchange)	#顯示內(nèi)容
        show_is()	#判斷是否錯(cuò)誤
        equal_is=False
    else:
        text_equal()        

如果按下的是特殊按鍵,除非是退格和回車,否則都不會(huì)有反應(yīng),

按下字母、數(shù)字、符號(hào)鍵的時(shí)候,輸入按鍵內(nèi)容。

接下來(lái)就是綁定鍵盤事件了:

root.bind('<Key>',bind_print)	#當(dāng)鍵盤按下任意鍵,執(zhí)行bind_print

這樣,界面布置和功能就完成了‘

2.4 循環(huán)

將主窗體root放入主循環(huán)中:

root.mainloop()

3.全部代碼

import tkinter as tk

def create_btn(text,col,row,cs,rs,pri='',px=(1,1),py=(1,1)):   #函數(shù)生成按鈕
    if pri=='':
        t=text
    else:
        t=pri
    a=tk.Button(root,text=text,width=4,command=lambda:(text_print(t)))
    a.grid(column=col,row=row,columnspan=cs,rowspan=rs,padx=px,pady=py,sticky='nswe')
    return(a)

def grid_rowconfigure(*rows):   #函數(shù)填充行
    for i in rows:
        root.grid_rowconfigure(i,weight=1)
        
def grid_columnconfigure(*cols):    #函數(shù)填充列
    for i in cols:
        root.grid_columnconfigure(i,weight=1)

def bind_print(event):  #函數(shù)鍵盤事件輸入算式
    global textchange,equal_is
    if event.keysym!='Return':
        if event.keysym=='BackSpace':
            a=str(textchange)[0:-1]
            textchange=a
        elif event.keysym=='Delete':
            textchange=''
        else:
            textchange=str(textchange)+str(event.char)
        la.configure(text=textchange)
        show_is()
        equal_is=False
    else:
        text_equal()

def text_print(x):  #函數(shù)按鈕輸入算式
    global textchange,equal_is
    if x!='=':
        if x=='←':
            a=str(textchange)[0:-1]
            textchange=a
        elif x=='C':
            textchange=''
        else:
            textchange=str(textchange)+str(x)
        la.configure(text=textchange)
        show_is()
        equal_is=False
    if x=='=':
        text_equal()
    
def text_equal(event=None):   #函數(shù)計(jì)算結(jié)果并上到輸入框
    global textchange,equal_is
    if lab['text']!='錯(cuò)誤' and equal_is==False:
        textchange=lab['text']
        la.configure(text=textchange)
        lab.configure(text='')
        equal_is=True

def show_is():     #顯示框內(nèi)容
    global textchange
    if textchange!='':
        try:
            textshow=eval(textchange)
        except (SyntaxError,TypeError,NameError):
            lab.configure(text='錯(cuò)誤')
        else:
            lab.configure(text=textshow)
    else:
        lab.configure(text='')

root=tk.Tk()        #創(chuàng)建窗體
root.geometry('250x350')
root.title('計(jì)算器')
root.bind('<Key>',bind_print)

equal_is=False      #定義一些函數(shù)
textchange=''

la=tk.Label(root,text='',bg='white',fg='black',font=('宋體',24),anchor='w',relief='flat')  #生成輸入框
la.grid(column=0,row=0,columnspan=5,rowspan=1,sticky='we')

lab=tk.Label(root,bg='white',fg='grey',height=1,font=('宋體',22),anchor='w',relief='flat')    #生成顯示框
lab.grid(column=0,row=1,columnspan=5,rowspan=1,sticky='we')

btn={}                                  #生成按鈕
btn['1']=create_btn('1',0,5,1,1)
btn['2']=create_btn('2',1,5,1,1)
btn['3']=create_btn('3',2,5,1,1)
btn['4']=create_btn('4',0,4,1,1)
btn['5']=create_btn('5',1,4,1,1)
btn['6']=create_btn('6',2,4,1,1)
btn['7']=create_btn('7',0,3,1,1)
btn['8']=create_btn('8',1,3,1,1)
btn['9']=create_btn('9',2,3,1,1)
btn['0']=create_btn('0',0,6,2,1)

btn['.']=create_btn('.',2,6,1,1)
btn['=']=create_btn('=',4,5,1,2)
btn['+']=create_btn('+',3,6,1,1)
btn['-']=create_btn('-',3,5,1,1)
btn['*']=create_btn('×',3,4,1,1,pri='*')
btn['/']=create_btn('÷',4,4,1,1,pri='/')
btn['←']=create_btn('←',1,2,1,1)

btn['C']=create_btn('C',2,2,1,1)
btn['(']=create_btn('(',3,2,1,1)
btn[')']=create_btn(')',4,2,1,1)
btn['**2']=create_btn('x²',3,3,1,1,pri='**2')
btn['**(-1)']=create_btn('1/x',4,3,1,1,pri='**(-1)')

grid_rowconfigure(2,3,4,5,6)
grid_columnconfigure(0,1,2,3,4)

root.mainloop()

4. 結(jié)束語(yǔ)

以上就是做一個(gè)簡(jiǎn)單計(jì)算器的過(guò)程,效果如開頭所示。

本人技術(shù)還較差,歡迎向我提出任何的意見。

到此這篇關(guān)于如何利用python的tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算器的文章就介紹到這了,更多相關(guān)python tkinter簡(jiǎn)單計(jì)算器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Python中兩個(gè)不同shape的數(shù)組間運(yùn)算規(guī)則

    關(guān)于Python中兩個(gè)不同shape的數(shù)組間運(yùn)算規(guī)則

    這篇文章主要介紹了關(guān)于Python中兩個(gè)不同shape的數(shù)組間運(yùn)算規(guī)則,眾所周知,相同?shape?的兩個(gè)數(shù)組間運(yùn)算是指兩個(gè)數(shù)組的對(duì)應(yīng)元素相加,我們經(jīng)常會(huì)碰到一些不同?shape?的數(shù)組間運(yùn)算,需要的朋友可以參考下
    2023-08-08
  • Python使用matplotlib的pie函數(shù)繪制餅狀圖功能示例

    Python使用matplotlib的pie函數(shù)繪制餅狀圖功能示例

    這篇文章主要介紹了Python使用matplotlib的pie函數(shù)繪制餅狀圖功能,結(jié)合實(shí)例形式分析了Python使用matplotlib的pie函數(shù)進(jìn)行餅狀圖繪制的具體操作技巧,注釋中對(duì)pie函數(shù)的用法進(jìn)行了詳細(xì)的說(shuō)明,便于理解,需要的朋友可以參考下
    2018-01-01
  • 解決pycharm 工具欄Tool中找不到Run manager.py Task的問(wèn)題

    解決pycharm 工具欄Tool中找不到Run manager.py Task的問(wèn)題

    今天小編就為大家分享一篇解決pycharm 工具欄Tool中找不到Run manager.py Task的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python中如何將一個(gè)類方法變?yōu)槎鄠€(gè)方法

    Python中如何將一個(gè)類方法變?yōu)槎鄠€(gè)方法

    這篇文章主要介紹了Python中如何將一個(gè)類方法變?yōu)槎鄠€(gè)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 解決CentOS下ImportError: No module named '_sqlite3'的問(wèn)題

    解決CentOS下ImportError: No module named &a

    這篇文章主要介紹了解決CentOS下ImportError: No module named '_sqlite3'的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 從django的中間件直接返回請(qǐng)求的方法

    從django的中間件直接返回請(qǐng)求的方法

    今天小編就為大家分享一篇從django的中間件直接返回請(qǐng)求的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Python模塊、包(Package)概念與用法分析

    Python模塊、包(Package)概念與用法分析

    這篇文章主要介紹了Python模塊、包(Package)概念與用法,結(jié)合實(shí)例形式分析了Python中模塊、包(Package)概念、功能、相關(guān)使用技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-05-05
  • From CSV to SQLite3 by python 導(dǎo)入csv到sqlite實(shí)例

    From CSV to SQLite3 by python 導(dǎo)入csv到sqlite實(shí)例

    今天小編就為大家分享一篇From CSV to SQLite3 by python 導(dǎo)入csv到sqlite實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • selenium+python實(shí)現(xiàn)文件上傳操作的方法實(shí)例

    selenium+python實(shí)現(xiàn)文件上傳操作的方法實(shí)例

    文件上傳功能是我們?cè)谌粘i_發(fā)中經(jīng)常會(huì)遇到的一個(gè)需求,下面這篇文章主要給大家介紹了關(guān)于selenium+python實(shí)現(xiàn)文件上傳操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • Python OpenCV利用筆記本攝像頭實(shí)現(xiàn)人臉檢測(cè)

    Python OpenCV利用筆記本攝像頭實(shí)現(xiàn)人臉檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了Python OpenCV利用筆記本攝像頭實(shí)現(xiàn)人臉檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04

最新評(píng)論