01实现
我们几乎每个人都用过计算器,大家对于计算器应该都是比较熟悉的,计算器整体也是比较简单的,主要包括:显示器、键盘、运算的逻辑处理等,计算器的图形界面我们使用 tkinter 库实现,下面看一下具体实现过程。
首先,我们画一个主窗口,代码实现如下:
# 创建主窗口tk = tkinter.Tk()# 设置窗口大小和位置tk.geometry('300x210+500+200')# 不允许改变窗口大小tk.resizable(False, False)# 设置窗口标题tk.title('计算器')
看一下效果:
我们接着画显示器,代码实现如下:
# 自动刷新字符串变量,可用 set 和 get 方法进行传值和取值contentVar = tkinter.StringVar(tk, '')# 创建单行文本框contentEntry = tkinter.Entry(tk, textvariable=contentVar)# 设置文本框为只读contentEntry['state'] = 'readonly'# 设置文本框坐标及宽高contentEntry.place(x=20, y=10, width=260, height=30)
再接着画键盘,代码实现如下:
# 按钮显示内容bvalue = ['C', '+', '-', '//', '2', '0', '1', '√', '3', '4', '5', '*', '6', '7', '8', '.', '9', '/', '**', '=']index = 0# 将按钮进行 5x4 放置for row in range(5):for col in range(4):d = bvalue[index]index += 1btnDigit = tkinter.Button(tk, text=d, command=lambda x=d: onclick(x))btnDigit.place(x=20 + col * 70, y=50 + row * 30, width=50, height=20)
看一下效果:
界面画完了,我们看一下处理运算逻辑的代码,如下所示:
# 点击事件def onclick(btn):# 运算符operation = ('+', '-', '*', '/', '**', '//')# 获取文本框中的内容content = contentVar.get()# 如果已有内容是以小数点开头的,在前面加 0if content.startswith('.'):content = '0' + content # 字符串可以直接用+来增加字符# 根据不同的按钮作出不同的反应if btn in '0123456789':# 按下 0-9 在 content 中追加content += btnelif btn == '.':# 将 content 从 +-*/ 这些字符的地方分割开来lastPart = re.split(r'\+|-|\*|/', content)[-1]if '.' in lastPart:# 信息提示对话框tkinter.messagebox.showerror('错误', '重复出现的小数点')returnelse:content += btnelif btn == 'C':# 清除文本框content = ''elif btn == '=':try:# 对输入的表达式求值content = str(eval(content))except:tkinter.messagebox.showerror('错误', '表达式有误')returnelif btn in operation:if content.endswith(operation):tkinter.messagebox.showerror('错误', '不允许存在连续运算符')returncontent += btnelif btn == '√':# 从 . 处分割存入 n,n 是一个列表n = content.split('.')# 如果列表中所有的都是数字,就是为了检查表达式是不是正确的if all(map(lambda x: x.isdigit(), n)):content = eval(content) ** 0.5else:tkinter.messagebox.showerror('错误', '表达式错误')return# 将结果显示到文本框中contentVar.set(content)
整体实现完了之后,我们来演示一下,看一下效果:
是不是有内味了。
02 打包
为了更加方便的使用,我们可以将 Python 代码打包成 exe 文件,打包我们使用 pyinstaller,安装用 pip install pyinstaller 命令即可。
打包时我们使用 pyinstaller —onefile —nowindowed counter.py 命令即可,此时打包生成的文件是使用的默认图标,如果我们想指定自己的图标可以添加参数 —icon=”xxx\xxx.ico”,打包生成的文件在 dist 目录。
如下图所示:
此时,我们直接运行 exe 文件就行了。
03 总结
本文我们使用 Python 实现了一个简易的计算器,大家如果有兴趣的话,可以尝试添加更多的功能以及对键盘进行个性化修改。
完整代码
import tkinterimport refrom tkinter import messagebox# 创建主窗口tk = tkinter.Tk()# 设置窗口大小和位置tk.geometry('300x210+500+200')# 不允许改变窗口大小tk.resizable(False, False)# 设置窗口标题tk.title('计算器')# 自动刷新字符串变量,可用 set 和 get 方法进行传值和取值contentVar = tkinter.StringVar(tk, '')# 创建单行文本框contentEntry = tkinter.Entry(tk, textvariable=contentVar)# 设置文本框为只读contentEntry['state'] = 'readonly'# 设置文本框坐标及宽高contentEntry.place(x=20, y=10, width=260, height=30)# 按钮显示内容bvalue = ['C', '+', '-', '//', '2', '0', '1', '√', '3', '4', '5', '*', '6', '7', '8', '.', '9', '/', '**', '=']index = 0# 将按钮进行 5x4 放置for row in range(5):for col in range(4):d = bvalue[index]index += 1btnDigit = tkinter.Button(tk, text=d, command=lambda x=d: onclick(x))btnDigit.place(x=20 + col * 70, y=50 + row * 30, width=50, height=20)'''contentVar.set() # 设置文本显示内容print(contentVar.get()) # 获取文本框内容'''# 点击事件def onclick(btn):# 运算符operation = ('+', '-', '*', '/', '**', '//')# 获取文本框中的内容content = contentVar.get()# 如果已有内容是以小数点开头的,在前面加 0if content.startswith('.'):content = '0' + content # 字符串可以直接用+来增加字符# 根据不同的按钮作出不同的反应if btn in '0123456789':# 按下 0-9 在 content 中追加content += btnelif btn == '.':# 将 content 从 +-*/ 这些字符的地方分割开来lastPart = re.split(r'\+|-|\*|/', content)[-1]if '.' in lastPart:# 信息提示对话框tkinter.messagebox.showerror('错误', '重复出现的小数点')returnelse:content += btnelif btn == 'C':# 清除文本框content = ''elif btn == '=':try:# 对输入的表达式求值content = str(eval(content))except:tkinter.messagebox.showerror('错误', '表达式有误')returnelif btn in operation:if content.endswith(operation):tkinter.messagebox.showerror('错误', '不允许存在连续运算符')returncontent += btnelif btn == '√':# 从 . 处分割存入 n,n 是一个列表n = content.split('.')# 如果列表中所有的都是数字,就是为了检查表达式是不是正确的if all(map(lambda x: x.isdigit(), n)):content = eval(content) ** 0.5else:tkinter.messagebox.showerror('错误', '表达式错误')return# 将结果显示到文本框中contentVar.set(content)tk.mainloop() # 循环
