Python制作简易计算器功能
作者:壹屋安源 发布时间:2023-05-06 19:53:47
本文实例为大家分享了Python制作简易计算器的具体代码,供大家参考,具体内容如下
简易计算器
简易计算器功能:
实现输入,计算,输出功能;
可以计算基本的加减乘除功能;
处理除法中除数不能为零的设计;
处理输入不能为空的设计;
记录历史计算,显示在右边文本框;
不同于之前的两个项目,这个项目的布局是网格布局,窗口的设计比较像,但是实际的网格布局实现过程中也是碰了许多的坑。
窗口
实现最基本的窗口界面
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)
布局
标题
使用标签Label实现,标签上可以展示文字,居中,可以设置背景色,字体字号,以及标签的大小。
b=tk.Label(win, text='简易计算器',justify=tk.CENTER, height=2 , width=50 ,font=('楷体', 20),background='lightcyan') # 文本框名字
b.grid(row=0,columnspan=6)
输入框
输入框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)
文本记录框
记录历史计算的文本,通过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)
附完整代码:
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()
本篇博客只实现了较为简单的计算功能,当然也可以设计更多的功能,只需要加以研究,就可以完成。
来源:https://blog.csdn.net/qq_44793283/article/details/111571179


猜你喜欢
- 引言作为一个web前端开发,对axios肯定不陌生,但是在前端开发中,一般是使用axios来请求后端接口,获取数据。而使用node+axio
- TensorFlow 2.0之后动态分配显存import tensorflow as tfconfig = tf.compat.v1.Con
- 有没有曾经为IE浏览器中长按钮莫名其妙的padding感到困扰?在分析解决方法之前,我们首先来看一下问题所在。在IE中,如果按钮文本比较长,
- 这个是JS控制图片滚动的效果,当鼠标结果新闻标题时开始滚动到对应的图片,可以作为图片新闻。效果图:<!DOCTYPE HTML PUB
- 问题描述输入一串字符,由字母、数字和空格组成,长度 < 1000, 判断其中是否存在日期格式的数据。日期格式的数据具有如下的特征,连续
- 看看这个logo,有些像python的小蛇吧 。这次介绍的数据库codernityDB是纯python开发的。先前用了下tinyDB这个本地
- 在Python中os模块里,os.renames() 方法用于递归重命名目录或文件。类似rename()。rename()方法语法格式如下:
- 这是我自己做的一个轮播图,大家可以看看 ,我还没进行优化.有改进的地方可以私聊布局什么的你们自己搞定吧<div class="
- 1、说明当函数/方法执行出现异常,会将异常传递给函数/方法的调用一方。如果传递到主程序,仍然没有异常处理,程序才会被终止。2、实例def d
- 本文实例讲述了Python使用pyautocad+openpyxl处理cad文件。分享给大家供大家参考,具体如下:示例1:from pyau
- Python是一门非常酷的语言,因为很少的Python代码可以在短时间内做很多事情,并且,Python很容易就能支持多任务和多重处理。py&
- 简介除ide的执行方式外,命令行的方式执行Python脚本是参数化程序执行的一种常见且简单的方法,正确处理命令行参数,可以提供给包含某种参数
- 一、mysql主(称master)从(称slave)复制的原理: (1).mas
- 在python中调用fortran代码,要用到f2py这个程序。它的项目主页在此。现在该项目已经合并到numpy中了,先安装python再装
- SQL,数据分析岗的必备技能,你可以不懂Python,R,不懂可视化,不懂机器学习。但SQL,你必须懂。要不然领导让你跑个数据来汇.....
- 之前有群友反应同事给了他一个几百MB的sql脚本,导入数据库再从数据库读取数据有点慢,想了解下有没有可以直接读取sql脚本到pandas的方
- MySQL安装说明MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle旗下产品。MySQL 是最流行
- js 闭包(closure)是Javascript语言的一个难点,也是它的特色。闭包的作用:通过一系方法,将函数内部的变量(局部变量)转化为
- 本文实例讲述了Go语言实现的树形结构数据比较算法。分享给大家供大家参考。具体实现方法如下:// Two binary trees may b
- str.join即sequence – 要连接的元素序列。返回通过指定字符连接序列中元素后生成的新字符串。n =