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 相关文章推荐
用pywin32实现windows模拟鼠标及键盘动作
Apr 22 Python
介绍Python中的一些高级编程技巧
Apr 02 Python
python类继承与子类实例初始化用法分析
Apr 17 Python
用Python操作字符串之rindex()方法的使用
May 19 Python
Python闭包的两个注意事项(推荐)
Mar 20 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
Jan 18 Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 Python
Python3实现对列表按元组指定列进行排序的方法分析
Dec 22 Python
python面试题小结附答案实例代码
Apr 11 Python
在Tensorflow中实现梯度下降法更新参数值
Jan 23 Python
Python中and和or如何使用
May 28 Python
Python3爬虫中关于中文分词的详解
Jul 29 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
sphinx增量索引的一个问题
2011/06/14 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
2013/06/05 Javascript
JS实现关键字搜索时的相关下拉字段效果
2014/08/05 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
2014/10/11 Javascript
jQuery操作JSON的CRUD用法实例
2015/02/25 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
Vue 进阶教程之v-model详解
2017/05/06 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
2018/07/18 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
2018/10/24 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
Vue select 绑定动态变量的实例讲解
2020/10/22 Javascript
Python 错误和异常小结
2013/10/09 Python
python文件和目录操作方法大全(含实例)
2014/03/12 Python
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
HTML5移动开发图片压缩上传功能
2016/11/09 HTML / CSS
端口镜像是怎么实现的
2014/03/25 面试题
Linux文件操作命令都有哪些
2016/07/23 面试题
机械专业个人求职自荐信格式
2013/09/21 职场文书
药学专业大学生个人的自我评价
2013/11/04 职场文书
商场经理竞聘演讲稿
2014/01/01 职场文书
乡镇干部十八大感言
2014/02/17 职场文书
服务承诺书格式
2014/05/21 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
客户经理岗位职责大全
2015/04/09 职场文书
停水通知
2015/04/16 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
总结Pyinstaller打包的高级用法
2021/06/28 Python