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 截取 取出一部分的字符串方法
Mar 01 Python
使用Python & Flask 实现RESTful Web API的实例
Sep 19 Python
详解Python如何生成词云的方法
Jun 01 Python
python topN 取最大的N个数或最小的N个数方法
Jun 04 Python
对pandas中Series的map函数详解
Jul 25 Python
Python中Numpy ndarray的使用详解
May 24 Python
通过python改变图片特定区域的颜色详解
Jul 15 Python
详解Django CAS 解决方案
Oct 30 Python
python列表推导式操作解析
Nov 26 Python
Django使用Profile扩展User模块方式
May 14 Python
Keras实现支持masking的Flatten层代码
Jun 16 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
Jul 28 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 禁止页面缓存输出
2009/01/07 PHP
第五章 php数组操作
2011/12/30 PHP
javascript整除实现代码
2010/11/23 Javascript
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
2017/03/30 jQuery
javascript防篡改对象实例详解
2017/04/10 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
js操作二进制数据方法
2018/03/03 Javascript
vue 使用html2canvas将DOM转化为图片的方法
2018/09/11 Javascript
vue实现文字加密功能
2019/09/27 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
python 数据加密代码
2008/12/24 Python
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
Python中functools模块的常用函数解析
2016/06/30 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
2019/06/25 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
用css3写出气球样式的示例代码
2017/09/11 HTML / CSS
canvas绘图按照contain或者cover方式适配并居中显示
2019/02/18 HTML / CSS
运动鞋、街头服装、手表和手袋的实时市场:StockX
2020/11/25 全球购物
电子商务专业实习生自我鉴定
2013/09/24 职场文书
民生工程实施方案
2014/03/22 职场文书
幼儿教师师德承诺书
2014/05/23 职场文书
小学班级特色活动方案
2014/08/31 职场文书
标准版离职证明书
2014/09/12 职场文书
预备党员群众路线教育实践活动思想汇报2014
2014/10/25 职场文书
秦兵马俑导游词
2015/02/02 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python