目录
用Python实现计算器可以让我们更好地理解面向对象编程、GUI 编程和事件驱动编程等概念,并掌握 Python 语言的基本语法和常用库。同时,计算器是一种常见的应用程序,实现它不仅可以提高我们的编程技能,还可以方便我们平时进行简单的计算。
在编写计算器程序的过程中,我们需要考虑很多问题,如如何设计 GUI 界面、如何处理用户输入、如何进行数值计算等等。这些问题都是实际编写应用程序时必须面对的,因此通过实现计算器程序,我们可以更好地了解实际软件开发中的问题和解决方法。
用Python实现计算器的过程包括以下步骤:
一、导入 tkinter 库
在 Python 中,使用 import
语句可以导入其他模块或库。在这个程序中,我们首先需要导入 tkinter 库,以便创建 GUI 界面。具体的语句如下:
import tkinter as tk
这里我们将 tkinter 库重命名为 tk
,以便在后面的代码中更方便地使用。
定义全局变量
在计算器程序中,我们需要保存当前输入的数字和运算符,以便进行计算。因此,我们在程序一开始就要定义一些变量来保存这些值。具体的变量有 num1
、num2
和 operator
,它们分别表示当前输入的第一个数字、第二个数字和运算符,初始值均为空字符串。此外,由于这些变量需要在多个函数中使用,因此我们将它们定义为全局变量。具体的语句如下:
# 定义全局变量,用于保存当前输入的数字和运算符
num1 = ''
num2 = ''
operator = ''
二、定义回调函数
在 GUI 界面中,按钮、菜单等控件被点击时会触发相应的事件,我们需要编写回调函数来处理这些事件。在这个程序中,我们需要编写三个回调函数,分别用于将数字、运算符和等于号添加到显示屏上,具体的函数如下:
-
add_digit(digit)
:该函数用于将数字添加到显示屏上。它的参数digit
表示当前点击的数字,函数会将该数字添加到num1
或num2
变量中,并更新显示屏的内容。如果当前没有输入运算符,则数字会被添加到num1
中;否则,数字会被添加到num2
中。具体的代码如下:
-
def add_digit(digit): global num1, num2, operator if operator == '': num1 += str(digit) label.config(text=num1) else: num2 += str(digit) label.config(text=num2)
-
add_operator(op)
:该函数用于将运算符添加到显示屏上。它的参数op
表示当前点击的运算符。函数会将该运算符添加到operator
变量中,并更新显示屏的内容。如果num1
不为空,则运算符会被添加到num1
后面;否则,运算符不会被添加到显示屏上。具体的代码如下: -
def add_operator(op): global num1, num2, operator if num1 != '' and num2 == '': operator = op label.config(text=num1 + operator)
-
calculate()
:该函数用于计算结果。它会根据当前缓存的数字和运算符计算结果,并更新显示屏的内容。具体的代码如下:
-
def calculate(): global num1, num2, operator if num1 != '' and num2 != '' and operator != '': num1 = str(eval(num1 + operator + num2)) num2 = '' operator = '' label.config(text=num1)
在计算过程中,我们使用了 Python 内置的
eval()
函数,该函数可以将字符串作为代码执行,并返回结果。这里我们将缓存的数字和运算符拼接成一个字符串,并将其传递给eval()
函数进行计算。
三、创建窗口对象
在 tkinter 中,创建一个窗口对象需要使用 Tk()
构造函数。在这个程序中,我们使用该函数创建了一个名为 window
的窗口对象,并设置了窗口标题为 Calculator
。具体的代码如下:
# 创建一个名为 window 的窗口对象
window = tk.Tk()
# 设置窗口标题
window.title('Calculator')
四、创建标签控件
在 tkinter 中,创建一个标签控件需要使用 Label()
构造函数。在这个程序中,我们使用该函数创建了一个名为 label
的标签控件,并设置了其字体、宽度、高度、背景色和文本对齐方式等属性。同时,我们将该标签控件放置在窗口中央,使用 grid()
方法指定其行列号和边距等参数。具体的代码如下:
# 创建一个标签对象,用于显示计算结果
label = tk.Label(window, text='0', font=('Arial', 20), width=15, height=2, bg='white', anchor='e')
# 将标签对象放置在窗口中央
label.grid(row=0, column=0, columnspan=4, padx=10, pady=10)
在这里,row=0
和 column=0
表示该控件位于第 1 行、第 1 列,columnspan=4
表示该控件跨越了 4 列(即占据整个顶部),padx=10
和 pady=10
表示控件边缘和窗口边框之间的水平和垂直间距均为 10。
五、创建数字按钮
在 tkinter 中,创建一个按钮控件需要使用 Button()
构造函数。在这个程序中,我们使用循环语句创建了数字按钮,并设置了其文本、字体、宽度、高度和回调函数等属性。同时,我们使用 grid()
方法指定了按钮的行列号和边距等参数,将其放置在窗口中间。具体的代码如下:
# 创建数字按钮并绑定回调函数
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)
表示数字按钮的取值范围,循环变量 i
依次取值 1 到 9。text=str(i)
表示按钮的文本为当前的数字;font=('Arial', 20)
表示按钮的字体为 Arial,大小为 20;width=3
和 height=2
表示按钮的宽度和高度;command=lambda digit=i:add_digit(digit)
表示按钮被点击后会调用 add_digit()
函数,并将当前的数字作为参数传递给该函数。在 grid()
方法中,row=(i-1)//3+1
和 column=(i-1)%3
表示按钮的行列号,padx=5
和 pady=5
表示控件边缘和窗口边框之间的水平和垂直间距均为 5。
六、创建加、减、乘、除和等于按钮
在 tkinter 中,创建一个按钮控件需要使用 Button()
构造函数。在这个程序中,我们使用该函数创建了加、减、乘、除和等于按钮,并设置了其文本、字体、宽度、高度和回调函数等属性。同时,我们使用 grid()
方法指定了按钮的行列号和边距等参数,将其放置在窗口中间。具体的代码如下:
# 创建加、减、乘、除、等于按钮并绑定回调函数
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('/')
表示分别将加、减、乘、除按钮的回调函数设置为 add_operator()
函数,并将相应的运算符作为参数传递给该函数;command=calculate
表示将等于按钮的回调函数设置为 calculate()
函数。在 grid()
方法中,row
和 column
表示按钮的行列号,padx
和 pady
表示控件边缘和窗口边框之间的水平和垂直间距。
七、创建清空按钮
在 tkinter 中,创建一个按钮控件需要使用 Button()
构造函数。在这个程序中,我们使用该函数创建了一个名为 btn_clear
的清空按钮,并设置了其文本、字体、宽度、高度和回调函数等属性。同时,我们使用 grid()
方法指定了按钮的行列号和边距等参数,将其放置在窗口底部。具体的代码如下:
# 创建清空按钮并绑定回调函数
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=
八、总结
这个程序使用了 tkinter 库来创建 GUI 界面。它创建一个名为 window
的窗口,并在窗口中央创建了一个标签,用于显示计算结果。然后,它使用循环语句创建了数字按钮,并绑定了回调函数add_digit()
,用于将数字添加到显示屏上;使用按钮对象创建了加、减、乘、除、等于按钮,并绑定了回调函数 add_operator()
和 calculate()
,分别用于将运算符添加到显示屏上和计算结果;最后,在底部创建了一个清空按钮,并绑定了回调函数 clear()
,用于清空显示屏和缓存的数字和运算符。
当用户点击数字按钮时,会调用 add_digit()
函数,该函数会将数字添加到 num1
或 num2
变量中,并更新显示屏的内容。当用户点击加、减、乘、除按钮时,会调用 add_operator()
函数,该函数会将运算符添加到 operator
变量中,并更新显示屏的内容。当用户点击等于按钮时,会调用 calculate()
函数,该函数会根据当前缓存的数字和运算符计算结果,并更新显示屏的内容。最后,当用户点击清空按钮时,会调用 clear()
函数,该函数会清空显示屏和缓存的数字和运算符。
完整代码:
import tkinter as tk
# 定义全局变量,用于保存当前输入的数字和运算符
num1 = ''
num2 = ''
operator = ''
# 定义一个函数,用于将数字添加到显示屏上
def add_digit(digit):
global num1, num2, operator
if operator == '':
num1 += str(digit)
label.config(text=num1)
else:
num2 += str(digit)
label.config(text=num2)
# 定义一个函数,用于将运算符添加到显示屏上
def add_operator(op):
global num1, num2, operator
if num1 != '' and num2 == '':
operator = op
label.config(text=num1 + operator)
# 定义一个函数,用于计算结果
def calculate():
global num1, num2, operator
if num1 != '' and num2 != '' and operator != '':
num1 = str(eval(num1 + operator + num2))
num2 = ''
operator = ''
label.config(text=num1)
# 创建一个名为 window 的窗口对象
window = tk.Tk()
# 设置窗口标题
window.title('Calculator')
# 创建一个标签对象,用于显示计算结果
label = tk.Label(window, text='0', font=('Arial', 20), width=15, height=2, bg='white', anchor='e')
# 将标签对象放置在窗口中央
label.grid(row=0, column=0, columnspan=4, padx=10, pady=10)
# 创建数字按钮并绑定回调函数
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)
# 创建加、减、乘、除、等于按钮并绑定回调函数
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)
# 创建清空按钮并绑定回调函数
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)
# 定义一个函数,用于清空显示屏和缓存的数字和运算符
def clear():
global num1, num2, operator
num1 = ''
num2 = ''
operator = ''
label.config(text='0')
# 进入主消息循环
window.mainloop()