博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python制作简易计算器
阅读量:3960 次
发布时间:2019-05-24

本文共 7964 字,大约阅读时间需要 26 分钟。

简易计算器

简易计算器功能:

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

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

窗口

实现最基本的窗口界面

import tkinter as tkimport tkinter.messageboxwin = tk.Tk()         #窗口名称win.title("简易计算器")win.geometry('650x600')  # 这里的乘是小xwin.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 tkimport tkinter.messageboxwin = tk.Tk()         #窗口名称win.title("简易计算器")win.geometry('650x600')  # 这里的乘是小xb=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=0def 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()

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

转载地址:http://rvtzi.baihongyu.com/

你可能感兴趣的文章
shell远程到其他机器, 执行本机脚本方法
查看>>
VC连接HTTP服务器 & MFC 处理 HTTP 请求的基本方法
查看>>
Visual Assist X 破解版使用步骤
查看>>
log4cxx 的编译安装过程和使用
查看>>
简单邮件系统程序
查看>>
六十八个超级经典小故事
查看>>
STL里的multimap使用详解
查看>>
STL 库其中的 std::string用法总结
查看>>
模态对话框的销毁过程与非模态对话的几种销毁方法
查看>>
智能控件变幻
查看>>
常见易错驾照考试题
查看>>
ANSI与UTF8之间的转换!std::string与UTF8之间的转换
查看>>
C++实现http下载 && 24点计算编码风格
查看>>
osg源码编译步骤
查看>>
自绘static控件,实现特殊效果
查看>>
#!/usr/bin/env python
查看>>
Linux中常用的操作命令以及vim操作命令和gdb调试命令
查看>>
windows以及linux 环境下Google Protocol Buffer 下载编译安装教程
查看>>
memcached了解使用和常用命令详解
查看>>
GDB调试各功能总结
查看>>