Python简易开发之制作计算器


Posted in Python onApril 28, 2022

简易计算器

简易计算器功能:

  • 实现输入,计算,输出功能;
  • 可以计算基本的加减乘除功能;
  • 处理除法中除数不能为零的设计;
  • 处理输入不能为空的设计;
  • 记录历史计算,显示在右边文本框;

不同于之前的两个项目,这个项目的布局是网格布局,窗口的设计比较像,但是实际的网格布局实现过程中也是碰了许多的坑。

窗口

实现最基本的窗口界面

import tkinter as tk
import tkinter.messagebox
win = tk.Tk()         #窗口名称
win.title("简易计算器")
win.geometry('650x600')  # 这里的乘是小x
win.mainloop()

geometry()设置窗口的大小,格式:高x宽+起始x位置+起始y位置,例如:“600x600+50+50”意思是大小为600*600,起始位置坐标为(50,50)

Python简易开发之制作计算器

布局

标题

使用标签Label实现,标签上可以展示文字,居中,可以设置背景色,字体字号,以及标签的大小。

b=tk.Label(win, text='简易计算器',justify=tk.CENTER, height=2 , width=50 ,font=('楷体', 20),background='lightcyan')  # 文本框名字
b.grid(row=0,columnspan=6)

Python简易开发之制作计算器

输入框

输入框a1,a2使用的是Entry,前面的名字使用的是Label标签
justify表示文字的位置,或者输入文字的起始位置是从那一边开始,有左和右,
width和height,代表宽度和高度
font,里面包含楷体和字号,这个可以不写,有默认值。
grid显示布局的位置,行列号。row,column分别代表行和列,rowspan,columnspan代表行列方向上占据的大小
通过输入框名字.get()获取输入框内的内容

b1=tk.Label(win, text='a:',justify=tk.CENTER, height=2 , width=5 ,font=('楷体', 15))  # 文本框名字
b1.grid(row=1,column=0)
a1 = tk.Entry(win, justify=tk.LEFT, width=15 , font=('楷体', 15))  # 文本框创建
a1.grid(row=1,column=1)

b2 = tk.Label(win, text='b:',justify=tk.CENTER, height=2 , width=5 , font=('楷体', 15))  # 文本框名字
b2.grid(row=2,column=0)
a2 = tk.Entry(win, justify=tk.LEFT, width=15 , font=('楷体', 15) )  # 文本框创建
a2.grid(row=2,column=1)

Python简易开发之制作计算器

文本记录框

记录历史计算的文本,通过insert插入拼接完成的字符串数据,通过数值标记完成换行 两列换行操作。如果不设置文本框的大小,只设置占据的行列数时,会导致窗口变得大小不定,组件之间的空隙较大,不并不很美观。

txt = tk.Text(win,height=20, width=40 ,font=('楷体', 15))    #font对输入的文本的字体和大小进行规定
txt.grid(row=1,column=4,rowspan=4,columnspan=4)                #大小是4*4

按钮功能

当两个数据输进去以后,我们将数据按照按钮点击的需求进行计算,并且弹出结果。实现功能:

  • 当输为空的时候,弹窗提示,并且保证可以再次输入数据等操作
  • 除法运算的特殊之处,除数不能为零,也需要在输入错误时进行提示
  • 当结果计算完成时,要完成算式的拼接,插入文本框中
  • 提示计算的结果
  • 清空输入框,等到下一次的计算输入
  • 判断历史计算的次数,为插入算式的位置进行改变。两列数据之间要进行间隔的设置。

每一个按钮的设计方法相似,知识各有各的实现功能,大同小异,格式都相同,只是计算不一样。可以通过研究一个函数功能,类推其他几个。

num=0     #用来记录历史计算次数
def sum():
    if a1.get()=='' or a2.get()=='':
        return tkinter.messagebox.showinfo('消息提示', '输入不能为空')
    global num
    num += 1
    a = float(a1.get())      #获取输入框内的内容,收集到的为字符型,需要进行转化
    b = float(a2.get())
    c = a + b
    s = str('%d'%a + ' + '+'%d'%b + ' = ' + '%d'%c)            #完成数据的拼接
    if num%2==0:
        s=s+ '\n'            #第偶数个算式后面加上空格进行间隔
        print(num)
    else:
        s=s+'\t'            #第奇数个算式进行换行处理
    txt.insert(tk.END,s)
    tkinter.messagebox.showinfo('消息提示', '求商结果是:%d'%c)
    a1.delete(0, tk.END)            #清空输入框内的数据
    a2.delete(0, tk.END)

def multiply():
    if a1.get()=='' or a2.get()=='':
        return tkinter.messagebox.showinfo('消息提示', '输入不能为空')
    global num
    num += 1
    a = float(a1.get())
    b = float(a2.get())
    c = a * b
    s = str('%d' % a + ' * ' + '%d' % b + ' = ' + '%d' % c)
    if num%2==0:
        s=s+ '\n'
        print(num)
    else:
        s=s+'\t'
    txt.insert(tk.END, s)
    tkinter.messagebox.showinfo('消息提示', '求积结果是:%d'%c)
    a1.delete(0, tk.END)
    a2.delete(0, tk.END)
def subtract():
    if a1.get()=='' or a2.get()=='':
        return tkinter.messagebox.showinfo('消息提示', '输入不能为空')
    global num
    num += 1
    a = float(a1.get())
    b = float(a2.get())
    c = a - b
    s = str('%d' % a + ' - ' + '%d' % b + ' = ' + '%d' % c)
    if num%2==0:
        s=s+ '\n'
        print(num)
    else:
        s=s+'\t'
    txt.insert(tk.END, s)
    tkinter.messagebox.showinfo('消息提示', '求差结果是:%d'%c)
    a1.delete(0, tk.END)
    a2.delete(0, tk.END)
def divide():
    if a1.get()=='' or a2.get()=='':
        return tkinter.messagebox.showinfo('消息提示', '输入不能为空')
    global num
    num += 1
    a = float(a1.get())
    b = float(a2.get())
    if float(b)==0.0:
        tkinter.messagebox.showinfo('消息提示', '除数不能为零!!!')
        a2.delete(0 , tk.END)  # 当除数为0时,不能进行计算,并且需要弹窗提示,清空数据
    else:
        c = a / b
        s = str('%d' % a + ' / ' + '%d' % b + ' = ' + '%d' % c)
        if num % 2 == 0:
            s = s + '\n'
            print(num)
        else:
            s = s + '\t'
        txt.insert(tk.END, s)
        tkinter.messagebox.showinfo('消息提示', '求商结果是:%d'%c)
        a1.delete(0, tk.END)
        a2.delete(0, tk.END)

按钮

这里有一个坑,刚开始我设计按钮的时候直接是:command = sum(),于是函数在我还没有点击按钮时就进行了一次计算,所以刚开始运行程序就提醒我输入不能为空。试了很多方法,才试到这个方法。在函数前面加上:“lamba:”。
justify=tk.CENTER设计文字在按钮的中间

a4 = tk.Button(win, text='求和',justify=tk.CENTER, width=10, font=('楷体', 15) ,command = lambda :sum() )  # 文本框创建
a4.grid(row=3, column=0)
a5 = tk.Button(win, text='求积', justify=tk.CENTER, width=10 , font=('楷体', 15), command = lambda :multiply())  # 文本框创建
a5.grid(row=3, column=1)
a6 = tk.Button(win, text='求差', justify=tk.CENTER, width=10, font=('楷体', 15), command = lambda :subtract()) # 文本框创建
a6.grid(row=4, column=0)
a7 = tk.Button(win, text='求商', justify=tk.CENTER, width=10, font=('楷体', 15), command = lambda :divide())  # 文本框创建
a7.grid(row=4, column=1)

Python简易开发之制作计算器

附完整代码:

import tkinter as tk
import tkinter.messagebox
win = tk.Tk()         #窗口名称
win.title("简易计算器")
win.geometry('650x600')  # 这里的乘是小x

b=tk.Label(win, text='简易计算器',justify=tk.CENTER, height=2 , width=50 ,font=('楷体', 20),background='lightcyan')  # 文本框名字
b.grid(row=0,columnspan=6)

b1=tk.Label(win, text='a:',justify=tk.CENTER, height=2 , width=5 ,font=('楷体', 15))  # 文本框名字
b1.grid(row=1,column=0)
a1 = tk.Entry(win, justify=tk.LEFT, width=15 , font=('楷体', 15))  # 文本框创建
a1.grid(row=1,column=1)

b2 = tk.Label(win, text='b:',justify=tk.CENTER, height=2 , width=5 , font=('楷体', 15))  # 文本框名字
b2.grid(row=2,column=0)
a2 = tk.Entry(win, justify=tk.LEFT, width=15 , font=('楷体', 15) )  # 文本框创建
a2.grid(row=2,column=1)


txt = tk.Text(win,height=20, width=40 ,font=('楷体', 15))
txt.grid(row=1,column=4,rowspan=4,columnspan=4)

num=0
def sum():
    if a1.get()=='' or a2.get()=='':
        return tkinter.messagebox.showinfo('消息提示', '输入不能为空')
    global num
    num += 1
    a = float(a1.get())
    b = float(a2.get())
    c = a + b
    s = str('%d'%a + ' + '+'%d'%b + ' = ' + '%d'%c)
    if num%2==0:
        s=s+ '\n'
        print(num)
    else:
        s=s+'\t'
    txt.insert(tk.END,s)
    tkinter.messagebox.showinfo('消息提示', '求商结果是:%d'%c)
    a1.delete(0, tk.END)
    a2.delete(0, tk.END)

def multiply():
    if a1.get()=='' or a2.get()=='':
        return tkinter.messagebox.showinfo('消息提示', '输入不能为空')
    global num
    num += 1
    a = float(a1.get())
    b = float(a2.get())
    c = a * b
    s = str('%d' % a + ' * ' + '%d' % b + ' = ' + '%d' % c)
    if num%2==0:
        s=s+ '\n'
        print(num)
    else:
        s=s+'\t'
    txt.insert(tk.END, s)
    tkinter.messagebox.showinfo('消息提示', '求积结果是:%d'%c)
    a1.delete(0, tk.END)
    a2.delete(0, tk.END)
def subtract():
    if a1.get()=='' or a2.get()=='':
        return tkinter.messagebox.showinfo('消息提示', '输入不能为空')
    global num
    num += 1
    a = float(a1.get())
    b = float(a2.get())
    c = a - b
    s = str('%d' % a + ' - ' + '%d' % b + ' = ' + '%d' % c)
    if num%2==0:
        s=s+ '\n'
        print(num)
    else:
        s=s+'\t'
    txt.insert(tk.END, s)
    tkinter.messagebox.showinfo('消息提示', '求差结果是:%d'%c)
    a1.delete(0, tk.END)
    a2.delete(0, tk.END)
def divide():
    if a1.get()=='' or a2.get()=='':
        return tkinter.messagebox.showinfo('消息提示', '输入不能为空')
    global num
    num += 1
    a = float(a1.get())
    b = float(a2.get())
    if float(b)==0.0:
        tkinter.messagebox.showinfo('消息提示', '除数不能为零!!!')
        a2.delete(0 , tk.END)  # 删除文本框内索引为0-999的字符
    else:
        c = a / b
        s = str('%d' % a + ' / ' + '%d' % b + ' = ' + '%d' % c)
        if num % 2 == 0:
            s = s + '\n'
            print(num)
        else:
            s = s + '\t'
        txt.insert(tk.END, s)
        tkinter.messagebox.showinfo('消息提示', '求商结果是:%d'%c)
        a1.delete(0, tk.END)
        a2.delete(0, tk.END)
a4 = tk.Button(win, text='求和',justify=tk.CENTER, width=10, font=('楷体', 15) ,command = lambda :sum() )  # 文本框创建
a4.grid(row=3, column=0)
a5 = tk.Button(win, text='求积', justify=tk.CENTER, width=10 , font=('楷体', 15), command = lambda :multiply())  # 文本框创建
a5.grid(row=3, column=1)
a6 = tk.Button(win, text='求差', justify=tk.CENTER, width=10, font=('楷体', 15), command = lambda :subtract()) # 文本框创建
a6.grid(row=4, column=0)
a7 = tk.Button(win, text='求商', justify=tk.CENTER, width=10, font=('楷体', 15), command = lambda :divide())  # 文本框创建
a7.grid(row=4, column=1)
win.mainloop()

本篇博客只实现了较为简单的计算功能,当然也可以设计更多的功能,只需要加以研究,就可以完成。


Tags in this post...

Python 相关文章推荐
用Python实现QQ游戏大家来找茬辅助工具
Sep 14 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
实例讲解Python中浮点型的基本内容
Feb 11 Python
Python批量生成幻影坦克图片实例代码
Jun 04 Python
python绘制评估优化算法性能的测试函数
Jun 25 Python
详解Python3 pickle模块用法
Sep 16 Python
python字典排序的方法
Oct 12 Python
keras在构建LSTM模型时对变长序列的处理操作
Jun 29 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
PyCharm配置anaconda环境的步骤详解
Jul 31 Python
Python抖音快手代码舞(字符舞)的实现方法
Feb 07 Python
Python实现对齐打印 format函数的用法
Apr 28 #Python
python实现简单的三子棋游戏
Apr 28 #Python
Python内置类型集合set和frozenset的使用详解
使用Python获取字典键对应值的方法
Apr 26 #Python
PyTorch中permute的使用方法
Apr 26 #Python
Python matplotlib 利用随机函数生成变化图形
方法汇总:Python 安装第三方库常用
Apr 26 #Python
You might like
PHP安装全攻略:APACHE
2006/10/09 PHP
PHP个人网站架设连环讲(二)
2006/10/09 PHP
生成静态页面的PHP类
2006/11/25 PHP
PHP 自定义错误处理函数trigger_error()
2013/03/26 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
JS实现简单的Canvas画图实例
2013/07/04 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
2017/01/13 Javascript
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
2020/05/01 Javascript
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
python创建临时文件夹的方法
2015/07/06 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
python中@property和property函数常见使用方法示例
2019/10/21 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
鼓舞士气的口号
2014/06/16 职场文书
老龙头导游词
2015/02/11 职场文书
紧急通知
2015/04/17 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
react中props 的使用及进行限制的方法
2021/04/28 Javascript
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android