python GUI计算器的实现


Posted in Python onOctober 09, 2020

01 实现

我们几乎每个人都用过计算器,大家对于计算器应该都是比较熟悉的,计算器整体也是比较简单的,主要包括:显示器、键盘、运算的逻辑处理等,计算器的图形界面我们使用 tkinter 库实现,下面看一下具体实现过程。

首先,我们画一个主窗口,代码实现如下:

# 创建主窗口
tk = tkinter.Tk()
# 设置窗口大小和位置
tk.geometry('300x210+500+200')
# 不允许改变窗口大小
tk.resizable(False, False)
# 设置窗口标题
tk.title('计算器')

看一下效果:

python GUI计算器的实现

我们接着画显示器,代码实现如下:

# 自动刷新字符串变量,可用 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)

看一下效果:

python GUI计算器的实现

再接着画键盘,代码实现如下:

# 按钮显示内容
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 += 1
    btnDigit = 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)

看一下效果:

python GUI计算器的实现

界面画完了,我们看一下处理运算逻辑的代码,如下所示:

# 点击事件
def onclick(btn):
  # 运算符
  operation = ('+', '-', '*', '/', '**', '//')
  # 获取文本框中的内容
  content = contentVar.get()
  # 如果已有内容是以小数点开头的,在前面加 0
  if content.startswith('.'):
    content = '0' + content # 字符串可以直接用+来增加字符
  # 根据不同的按钮作出不同的反应
  if btn in '0123456789':
    # 按下 0-9 在 content 中追加
    content += btn
  elif btn == '.':
    # 将 content 从 +-*/ 这些字符的地方分割开来
    lastPart = re.split(r'\+|-|\*|/', content)[-1]
    if '.' in lastPart:
      # 信息提示对话框
      tkinter.messagebox.showerror('错误', '重复出现的小数点')
      return
    else:
      content += btn
  elif btn == 'C':
    # 清除文本框
    content = ''
  elif btn == '=':
    try:
      # 对输入的表达式求值
      content = str(eval(content))
    except:
      tkinter.messagebox.showerror('错误', '表达式有误')
      return
  elif btn in operation:
    if content.endswith(operation):
      tkinter.messagebox.showerror('错误', '不允许存在连续运算符')
      return
    content += btn
  elif btn == '√':
    # 从 . 处分割存入 n,n 是一个列表
    n = content.split('.')
    # 如果列表中所有的都是数字,就是为了检查表达式是不是正确的
    if all(map(lambda x: x.isdigit(), n)):
      content = eval(content) ** 0.5
    else:
      tkinter.messagebox.showerror('错误', '表达式错误')
      return
  # 将结果显示到文本框中
  contentVar.set(content)

整体实现完了之后,我们来演示一下,看一下效果:

python GUI计算器的实现

是不是有内味了。

02 打包

为了更加方便的使用,我们可以将 Python 代码打包成 exe 文件,打包我们使用 pyinstaller,安装用 pip install pyinstaller 命令即可。

打包时我们使用 pyinstaller --onefile --nowindowed counter.py 命令即可,此时打包生成的文件是使用的默认图标,如果我们想指定自己的图标可以添加参数 --icon="xxx\xxx.ico",打包生成的文件在 dist 目录。

如下图所示:

python GUI计算器的实现

此时,我们直接运行 exe 文件就行了。

03 总结

本文我们使用 Python 实现了一个简易的计算器,大家如果有兴趣的话,可以尝试添加更多的功能以及对键盘进行个性化修改。

以上就是python GUI计算器的实现的详细内容,更多关于python 计算器的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
用实例解释Python中的继承和多态的概念
Apr 27 Python
通过数据库对Django进行删除字段和删除模型的操作
Jul 21 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
Jun 16 Python
Python 转义字符详细介绍
Mar 21 Python
python计算两个数的百分比方法
Jun 29 Python
Python lambda表达式用法实例分析
Dec 25 Python
python-xpath获取html文档的部分内容
Mar 06 Python
Python %r和%s区别代码实例解析
Apr 03 Python
学python最电脑配置有要求么
Jul 05 Python
Django celery异步任务实现代码示例
Nov 26 Python
python多线程爬取西刺代理的示例代码
Jan 30 Python
Python使用protobuf序列化和反序列化的实现
May 19 Python
Numpy实现卷积神经网络(CNN)的示例
Oct 09 #Python
Python使用socket_TCP实现小文件下载功能
Oct 09 #Python
python实现逻辑回归的示例
Oct 09 #Python
Django生成数据库及添加用户报错解决方案
Oct 09 #Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
Oct 09 #Python
python实现数据结构中双向循环链表操作的示例
Oct 09 #Python
Python collections模块的使用方法
Oct 09 #Python
You might like
php数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
php用户注册信息验证正则表达式
2015/11/12 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
jquery实用代码片段集合
2010/08/12 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
nodeJs爬虫获取数据简单实现代码
2016/03/29 NodeJs
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
2017/06/29 Javascript
基于js 本地存储(详解)
2017/08/16 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
Python函数学习笔记
2008/10/07 Python
python不带重复的全排列代码
2013/08/13 Python
Python日期的加减等操作的示例
2017/08/15 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
2018/01/08 Python
运动检测ViBe算法python实现代码
2018/01/09 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
使用pip安装python库的多种方式
2019/07/31 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
python mock测试的示例
2020/10/19 Python
详解Python利用configparser对配置文件进行读写操作
2020/11/03 Python
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
战略合作协议书范本
2014/04/18 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL
JavaScript阻止事件冒泡的方法
2021/12/06 Javascript
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers