快捷的網(wǎng)站建設(shè)排行榜百度seo關(guān)鍵詞排名查詢
目錄
一、導(dǎo)入 tkinter 庫
定義全局變量
二、定義回調(diào)函數(shù)
三、創(chuàng)建窗口對象
四、創(chuàng)建標(biāo)簽控件
五、創(chuàng)建數(shù)字按鈕
六、創(chuàng)建加、減、乘、除和等于按鈕
七、創(chuàng)建清空按鈕
八、總結(jié)
????????用Python實(shí)現(xiàn)計(jì)算器可以讓我們更好地理解面向?qū)ο缶幊?、GUI 編程和事件驅(qū)動(dòng)編程等概念,并掌握 Python 語言的基本語法和常用庫。同時(shí),計(jì)算器是一種常見的應(yīng)用程序,實(shí)現(xiàn)它不僅可以提高我們的編程技能,還可以方便我們平時(shí)進(jìn)行簡單的計(jì)算。
????????在編寫計(jì)算器程序的過程中,我們需要考慮很多問題,如如何設(shè)計(jì) GUI 界面、如何處理用戶輸入、如何進(jìn)行數(shù)值計(jì)算等等。這些問題都是實(shí)際編寫應(yīng)用程序時(shí)必須面對的,因此通過實(shí)現(xiàn)計(jì)算器程序,我們可以更好地了解實(shí)際軟件開發(fā)中的問題和解決方法。
用Python實(shí)現(xiàn)計(jì)算器的過程包括以下步驟:
導(dǎo)入所需庫:我們需要使用 tkinter 庫來創(chuàng)建 GUI 界面,并使用 eval 函數(shù)來進(jìn)行數(shù)值計(jì)算。
創(chuàng)建 GUI 界面:使用 tkinter 庫來創(chuàng)建一個(gè)窗口,并在窗口中添加數(shù)字按鈕、運(yùn)算符按鈕和其他功能按鈕,如清除按鈕、等于按鈕等。同時(shí),也需要在界面上創(chuàng)建一個(gè)文本框來顯示用戶輸入和計(jì)算結(jié)果。
處理用戶輸入:通過綁定按鈕事件和鍵盤事件來處理用戶對按鈕的單擊和鍵盤的輸入。當(dāng)用戶單擊數(shù)字按鈕時(shí),將數(shù)字添加到文本框中;當(dāng)用戶單擊運(yùn)算符按鈕時(shí),將操作符添加到文本框中。同時(shí)也需要處理刪除字符和清空文本框等操作。
進(jìn)行數(shù)值計(jì)算:當(dāng)用戶單擊等于按鈕時(shí),使用 eval 函數(shù)來計(jì)算文本框中的表達(dá)式,并將結(jié)果顯示在文本框中。
完善程序功能:根據(jù)需求可以增加其他功能,如添加小數(shù)點(diǎn)、處理錯(cuò)誤輸入、防止除零等。
一、導(dǎo)入 tkinter 庫
在 Python 中,使用 import
語句可以導(dǎo)入其他模塊或庫。在這個(gè)程序中,我們首先需要導(dǎo)入 tkinter 庫,以便創(chuàng)建 GUI 界面。具體的語句如下:
import tkinter as tk
這里我們將 tkinter 庫重命名為 tk
,以便在后面的代碼中更方便地使用。
定義全局變量
在計(jì)算器程序中,我們需要保存當(dāng)前輸入的數(shù)字和運(yùn)算符,以便進(jìn)行計(jì)算。因此,我們在程序一開始就要定義一些變量來保存這些值。具體的變量有 num1
、num2
和 operator
,它們分別表示當(dāng)前輸入的第一個(gè)數(shù)字、第二個(gè)數(shù)字和運(yùn)算符,初始值均為空字符串。此外,由于這些變量需要在多個(gè)函數(shù)中使用,因此我們將它們定義為全局變量。具體的語句如下:
# 定義全局變量,用于保存當(dāng)前輸入的數(shù)字和運(yùn)算符
num1 = ''
num2 = ''
operator = ''
二、定義回調(diào)函數(shù)
在 GUI 界面中,按鈕、菜單等控件被點(diǎn)擊時(shí)會(huì)觸發(fā)相應(yīng)的事件,我們需要編寫回調(diào)函數(shù)來處理這些事件。在這個(gè)程序中,我們需要編寫三個(gè)回調(diào)函數(shù),分別用于將數(shù)字、運(yùn)算符和等于號添加到顯示屏上,具體的函數(shù)如下:
-
add_digit(digit)
:該函數(shù)用于將數(shù)字添加到顯示屏上。它的參數(shù)digit
表示當(dāng)前點(diǎn)擊的數(shù)字,函數(shù)會(huì)將該數(shù)字添加到num1
或num2
變量中,并更新顯示屏的內(nèi)容。如果當(dāng)前沒有輸入運(yùn)算符,則數(shù)字會(huì)被添加到num1
中;否則,數(shù)字會(huì)被添加到num2
中。具體的代碼如下:
-
def add_digit(digit):global num1, num2, operatorif operator == '':num1 += str(digit)label.config(text=num1)else:num2 += str(digit)label.config(text=num2)
-
add_operator(op)
:該函數(shù)用于將運(yùn)算符添加到顯示屏上。它的參數(shù)op
表示當(dāng)前點(diǎn)擊的運(yùn)算符。函數(shù)會(huì)將該運(yùn)算符添加到operator
變量中,并更新顯示屏的內(nèi)容。如果num1
不為空,則運(yùn)算符會(huì)被添加到num1
后面;否則,運(yùn)算符不會(huì)被添加到顯示屏上。具體的代碼如下: -
def add_operator(op):global num1, num2, operatorif num1 != '' and num2 == '':operator = oplabel.config(text=num1 + operator)
-
calculate()
:該函數(shù)用于計(jì)算結(jié)果。它會(huì)根據(jù)當(dāng)前緩存的數(shù)字和運(yùn)算符計(jì)算結(jié)果,并更新顯示屏的內(nèi)容。具體的代碼如下:
-
def calculate():global num1, num2, operatorif num1 != '' and num2 != '' and operator != '':num1 = str(eval(num1 + operator + num2))num2 = ''operator = ''label.config(text=num1)
在計(jì)算過程中,我們使用了 Python 內(nèi)置的
eval()
函數(shù),該函數(shù)可以將字符串作為代碼執(zhí)行,并返回結(jié)果。這里我們將緩存的數(shù)字和運(yùn)算符拼接成一個(gè)字符串,并將其傳遞給eval()
函數(shù)進(jìn)行計(jì)算。
三、創(chuàng)建窗口對象
在 tkinter 中,創(chuàng)建一個(gè)窗口對象需要使用 Tk()
構(gòu)造函數(shù)。在這個(gè)程序中,我們使用該函數(shù)創(chuàng)建了一個(gè)名為 window
的窗口對象,并設(shè)置了窗口標(biāo)題為 Calculator
。具體的代碼如下:
# 創(chuàng)建一個(gè)名為 window 的窗口對象
window = tk.Tk()# 設(shè)置窗口標(biāo)題
window.title('Calculator')
四、創(chuàng)建標(biāo)簽控件
在 tkinter 中,創(chuàng)建一個(gè)標(biāo)簽控件需要使用 Label()
構(gòu)造函數(shù)。在這個(gè)程序中,我們使用該函數(shù)創(chuàng)建了一個(gè)名為 label
的標(biāo)簽控件,并設(shè)置了其字體、寬度、高度、背景色和文本對齊方式等屬性。同時(shí),我們將該標(biāo)簽控件放置在窗口中央,使用 grid()
方法指定其行列號和邊距等參數(shù)。具體的代碼如下:
# 創(chuàng)建一個(gè)標(biāo)簽對象,用于顯示計(jì)算結(jié)果
label = tk.Label(window, text='0', font=('Arial', 20), width=15, height=2, bg='white', anchor='e')# 將標(biāo)簽對象放置在窗口中央
label.grid(row=0, column=0, columnspan=4, padx=10, pady=10)
在這里,row=0
和 column=0
表示該控件位于第 1 行、第 1 列,columnspan=4
表示該控件跨越了 4 列(即占據(jù)整個(gè)頂部),padx=10
和 pady=10
表示控件邊緣和窗口邊框之間的水平和垂直間距均為 10。
五、創(chuàng)建數(shù)字按鈕
在 tkinter 中,創(chuàng)建一個(gè)按鈕控件需要使用 Button()
構(gòu)造函數(shù)。在這個(gè)程序中,我們使用循環(huán)語句創(chuàng)建了數(shù)字按鈕,并設(shè)置了其文本、字體、寬度、高度和回調(diào)函數(shù)等屬性。同時(shí),我們使用 grid()
方法指定了按鈕的行列號和邊距等參數(shù),將其放置在窗口中間。具體的代碼如下:
# 創(chuàng)建數(shù)字按鈕并綁定回調(diào)函數(shù)
for i in range(1, 10):btn = tk.Button(window, text=str(i), font=('Arial', 20), width=3, height=2, command=lambda digit=i:add_digit(digit))btn.grid(row=(i-1)//3+1, column=(i-1)%3, padx=5, pady=5)
在這里,range(1, 10)
表示數(shù)字按鈕的取值范圍,循環(huán)變量 i
依次取值 1 到 9。text=str(i)
表示按鈕的文本為當(dāng)前的數(shù)字;font=('Arial', 20)
表示按鈕的字體為 Arial,大小為 20;width=3
和 height=2
表示按鈕的寬度和高度;command=lambda digit=i:add_digit(digit)
表示按鈕被點(diǎn)擊后會(huì)調(diào)用 add_digit()
函數(shù),并將當(dāng)前的數(shù)字作為參數(shù)傳遞給該函數(shù)。在 grid()
方法中,row=(i-1)//3+1
和 column=(i-1)%3
表示按鈕的行列號,padx=5
和 pady=5
表示控件邊緣和窗口邊框之間的水平和垂直間距均為 5。
六、創(chuàng)建加、減、乘、除和等于按鈕
在 tkinter 中,創(chuàng)建一個(gè)按鈕控件需要使用 Button()
構(gòu)造函數(shù)。在這個(gè)程序中,我們使用該函數(shù)創(chuàng)建了加、減、乘、除和等于按鈕,并設(shè)置了其文本、字體、寬度、高度和回調(diào)函數(shù)等屬性。同時(shí),我們使用 grid()
方法指定了按鈕的行列號和邊距等參數(shù),將其放置在窗口中間。具體的代碼如下:
# 創(chuàng)建加、減、乘、除、等于按鈕并綁定回調(diào)函數(shù)
btn_add = tk.Button(window, text='+', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('+'))
btn_sub = tk.Button(window, text='-', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('-'))
btn_mul = tk.Button(window, text='*', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('*'))
btn_div = tk.Button(window, text='/', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('/'))
btn_eq = tk.Button(window, text='=', font=('Arial', 20), width=3, height=2, command=calculate)# 將按鈕對象放置在窗口中間
btn_add.grid(row=1, column=3, padx=5, pady=5)
btn_sub.grid(row=2, column=3, padx=5, pady=5)
btn_mul.grid(row=3, column=3, padx=5, pady=5)
btn_div.grid(row=4, column=3, padx=5, pady=5)
btn_eq.grid(row=4, column=2, padx=5, pady=5)
在這里,text='+'
、text='-'
、text='*'
和 text='/'
表示加、減、乘、除按鈕的文本,text='='
表示等于按鈕的文本;font=('Arial', 20)
表示按鈕的字體為 Arial,大小為 20;width=3
和 height=2
表示按鈕的寬度和高度;command=lambda:add_operator('+')
、command=lambda:add_operator('-')
、command=lambda:add_operator('*')
和 command=lambda:add_operator('/')
表示分別將加、減、乘、除按鈕的回調(diào)函數(shù)設(shè)置為 add_operator()
函數(shù),并將相應(yīng)的運(yùn)算符作為參數(shù)傳遞給該函數(shù);command=calculate
表示將等于按鈕的回調(diào)函數(shù)設(shè)置為 calculate()
函數(shù)。在 grid()
方法中,row
和 column
表示按鈕的行列號,padx
和 pady
表示控件邊緣和窗口邊框之間的水平和垂直間距。
七、創(chuàng)建清空按鈕
在 tkinter 中,創(chuàng)建一個(gè)按鈕控件需要使用 Button()
構(gòu)造函數(shù)。在這個(gè)程序中,我們使用該函數(shù)創(chuàng)建了一個(gè)名為 btn_clear
的清空按鈕,并設(shè)置了其文本、字體、寬度、高度和回調(diào)函數(shù)等屬性。同時(shí),我們使用 grid()
方法指定了按鈕的行列號和邊距等參數(shù),將其放置在窗口底部。具體的代碼如下:
# 創(chuàng)建清空按鈕并綁定回調(diào)函數(shù)
btn_clear = tk.Button(window, text='C', font=('Arial', 20), width=3, height=2, command=lambda:clear())
btn_clear.grid(row=4, column=0, padx=
八、總結(jié)
這個(gè)程序使用了 tkinter 庫來創(chuàng)建 GUI 界面。它創(chuàng)建一個(gè)名為 window
的窗口,并在窗口中央創(chuàng)建了一個(gè)標(biāo)簽,用于顯示計(jì)算結(jié)果。然后,它使用循環(huán)語句創(chuàng)建了數(shù)字按鈕,并綁定了回調(diào)函數(shù)add_digit()
,用于將數(shù)字添加到顯示屏上;使用按鈕對象創(chuàng)建了加、減、乘、除、等于按鈕,并綁定了回調(diào)函數(shù) add_operator()
和 calculate()
,分別用于將運(yùn)算符添加到顯示屏上和計(jì)算結(jié)果;最后,在底部創(chuàng)建了一個(gè)清空按鈕,并綁定了回調(diào)函數(shù) clear()
,用于清空顯示屏和緩存的數(shù)字和運(yùn)算符。
當(dāng)用戶點(diǎn)擊數(shù)字按鈕時(shí),會(huì)調(diào)用 add_digit()
函數(shù),該函數(shù)會(huì)將數(shù)字添加到 num1
或 num2
變量中,并更新顯示屏的內(nèi)容。當(dāng)用戶點(diǎn)擊加、減、乘、除按鈕時(shí),會(huì)調(diào)用 add_operator()
函數(shù),該函數(shù)會(huì)將運(yùn)算符添加到 operator
變量中,并更新顯示屏的內(nèi)容。當(dāng)用戶點(diǎn)擊等于按鈕時(shí),會(huì)調(diào)用 calculate()
函數(shù),該函數(shù)會(huì)根據(jù)當(dāng)前緩存的數(shù)字和運(yùn)算符計(jì)算結(jié)果,并更新顯示屏的內(nèi)容。最后,當(dāng)用戶點(diǎn)擊清空按鈕時(shí),會(huì)調(diào)用 clear()
函數(shù),該函數(shù)會(huì)清空顯示屏和緩存的數(shù)字和運(yùn)算符。
完整代碼:
import tkinter as tk# 定義全局變量,用于保存當(dāng)前輸入的數(shù)字和運(yùn)算符
num1 = ''
num2 = ''
operator = ''# 定義一個(gè)函數(shù),用于將數(shù)字添加到顯示屏上
def add_digit(digit):global num1, num2, operatorif operator == '':num1 += str(digit)label.config(text=num1)else:num2 += str(digit)label.config(text=num2)# 定義一個(gè)函數(shù),用于將運(yùn)算符添加到顯示屏上
def add_operator(op):global num1, num2, operatorif num1 != '' and num2 == '':operator = oplabel.config(text=num1 + operator)# 定義一個(gè)函數(shù),用于計(jì)算結(jié)果
def calculate():global num1, num2, operatorif num1 != '' and num2 != '' and operator != '':num1 = str(eval(num1 + operator + num2))num2 = ''operator = ''label.config(text=num1)# 創(chuàng)建一個(gè)名為 window 的窗口對象
window = tk.Tk()# 設(shè)置窗口標(biāo)題
window.title('Calculator')# 創(chuàng)建一個(gè)標(biāo)簽對象,用于顯示計(jì)算結(jié)果
label = tk.Label(window, text='0', font=('Arial', 20), width=15, height=2, bg='white', anchor='e')# 將標(biāo)簽對象放置在窗口中央
label.grid(row=0, column=0, columnspan=4, padx=10, pady=10)# 創(chuàng)建數(shù)字按鈕并綁定回調(diào)函數(shù)
for i in range(1, 10):btn = tk.Button(window, text=str(i), font=('Arial', 20), width=3, height=2, command=lambda digit=i:add_digit(digit))btn.grid(row=(i-1)//3+1, column=(i-1)%3, padx=5, pady=5)# 創(chuàng)建加、減、乘、除、等于按鈕并綁定回調(diào)函數(shù)
btn_add = tk.Button(window, text='+', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('+'))
btn_sub = tk.Button(window, text='-', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('-'))
btn_mul = tk.Button(window, text='*', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('*'))
btn_div = tk.Button(window, text='/', font=('Arial', 20), width=3, height=2, command=lambda:add_operator('/'))
btn_eq = tk.Button(window, text='=', font=('Arial', 20), width=3, height=2, command=calculate)# 將按鈕對象放置在窗口中間
btn_add.grid(row=1, column=3, padx=5, pady=5)
btn_sub.grid(row=2, column=3, padx=5, pady=5)
btn_mul.grid(row=3, column=3, padx=5, pady=5)
btn_div.grid(row=4, column=3, padx=5, pady=5)
btn_eq.grid(row=4, column=2, padx=5, pady=5)# 創(chuàng)建清空按鈕并綁定回調(diào)函數(shù)
btn_clear = tk.Button(window, text='C', font=('Arial', 20), width=3, height=2, command=lambda:clear())
btn_clear.grid(row=4, column=0, padx=5, pady=5)# 定義一個(gè)函數(shù),用于清空顯示屏和緩存的數(shù)字和運(yùn)算符
def clear():global num1, num2, operatornum1 = ''num2 = ''operator = ''label.config(text='0')# 進(jìn)入主消息循環(huán)
window.mainloop()