如何利用python的tkinter实现一个简单的计算器

做一个计算器,这是我想要达成的效果:

在按下按钮或者按下键盘的时候,第一行输入框会显示输入的内容,第二行显示框则会预览运算结果,如果发生异常,输入内容格式错误,无法计算,则显示框显示“错误”。

按“=”按钮或按键回车计算结果,结果显示在第一行。

1.准备工作

导入库 tkinter

import tkinter as tk

2. 开始

定义两个变量:

equal_is=False      #定义一些变量
textchange=''

equal_is 用于判断是否已经计算出结果,textchange是用于设置输入框的内容。

2.1 生成控件

首先生成窗体:

root=tk.Tk()        #创建窗体
root.geometry('250x350')
root.title('计算器')

为了方便,在这里定义一个函数 create_btn

def create_btn(text,col,row,cs,rs,pri='',px=(1,1),py=(1,1)):   #函数:生成按钮
    if pri=='':
        t=text
    else:
        t=pri
    a=tk.Button(root,text=text,width=4,command=lambda:(text_print(t)))	#输入内容
    a.grid(column=col,row=row,columnspan=cs,rowspan=rs,padx=px,pady=py,sticky='nswe')
    return(a)

因为有些按钮的输入内容并不等于它的文本内容(比如按钮“×”,输入“*”),因此我们设置一个空的参数 pri ,在 pri 没有被赋值的时候,输入内容则为 text 。

text_print 是输入内容的函数,这个在后面会定义。

btn={}                                  #生成按钮
btn['1']=create_btn('1',0,5,1,1)
btn['2']=create_btn('2',1,5,1,1)
btn['3']=create_btn('3',2,5,1,1)
btn['4']=create_btn('4',0,4,1,1)
btn['5']=create_btn('5',1,4,1,1)
btn['6']=create_btn('6',2,4,1,1)
btn['7']=create_btn('7',0,3,1,1)
btn['8']=create_btn('8',1,3,1,1)
btn['9']=create_btn('9',2,3,1,1)
btn['0']=create_btn('0',0,6,2,1)

btn['.']=create_btn('.',2,6,1,1)
btn['=']=create_btn('=',4,5,1,2)
btn['+']=create_btn('+',3,6,1,1)
btn['-']=create_btn('-',3,5,1,1)
btn['*']=create_btn('×',3,4,1,1,pri='*')
btn['/']=create_btn('÷',4,4,1,1,pri='/')
btn['←']=create_btn('←',1,2,1,1)

btn['C']=create_btn('C',2,2,1,1)
btn['(']=create_btn('(',3,2,1,1)
btn[')']=create_btn(')',4,2,1,1)
btn['**2']=create_btn('x²',3,3,1,1,pri='**2')
btn['**(-1)']=create_btn('1/x',4,3,1,1,pri='**(-1)')

上面是用 create_btn 函数生成每一个按钮。

la=tk.Label(root,text='',bg='white',fg='black',font=('宋体',24),anchor='w',relief='flat')  #生成输入框
la.grid(column=0,row=0,columnspan=5,rowspan=1,sticky='we')

lab=tk.Label(root,bg='white',fg='grey',height=1,font=('宋体',22),anchor='w',relief='flat')    #生成显示框
lab.grid(column=0,row=1,columnspan=5,rowspan=1,sticky='we')

上面创建两个标签,作为输入框和显示框。

la 是输入框,lab是显示框。

然后定义函数 grid_rowconfigure 和 grid_columnconfigure,用于自动填充行和列:

def grid_rowconfigure(*rows):   #函数填充行。*rows:允许接收多个参数
    for i in rows:
        root.grid_rowconfigure(i,weight=1)

def grid_columnconfigure(*cols):    #函数填充列。*cols:允许接收多个参数
    for i in cols:
        root.grid_columnconfigure(i,weight=1)

在窗体被改变大小时,按钮会自动填充四周,而输入、显示框只填充左右两边(第2,3,4,5,6行会向竖直方向填充,每一列都会向水平方向填充)。

grid_rowconfigure(2,3,4,5,6)
grid_columnconfigure(0,1,2,3,4)

2.2 定义输入和计算函数

定义 text_print 函数,当按钮被点击时输入内容,当按钮“=”被点击的时候计算结果:

def text_print(x):  #函数按钮输入算式
    global textchange,equal_is	#声明全局变量
    if x!='=':
        if x=='←':
            a=str(textchange)[0:-1]
            textchange=a	#退格
        elif x=='C':
            textchange=''	#清空
        else:
            textchange=str(textchange)+str(x)	#输入
        la.configure(text=textchange)
        show_is()
        equal_is=False	#判断格式有无错误
    if x=='=':
        text_equal()	#计算结果

show_is 用于判断格式有无错误:

def show_is():     #显示框内容
    global textchange	#声明全局变量
    if textchange!='':
        try:
            textshow=eval(textchange)
        except (SyntaxError,TypeError,NameError):
            lab.configure(text='错误')	#如果出错了,则显示“错误”
        else:
            lab.configure(text=textshow)	#如果没有出错,则显示结果
    else:
        lab.configure(text='')	#如果输入框为空,那么清空显示框

text_equal 是计算结果的函数:

def text_equal(event=None):   #函数计算结果并上到输入框
    global textchange,equal_is	#声明全局变量
    if lab['text']!='错误' and equal_is==False:
        textchange=lab['text']	#无格式错误时,计算结果
        la.configure(text=textchange)	#输入框显示结果
        lab.configure(text='')	#清空显示框
        equal_is=True

这里详细说明一下 equal_is 的作用:

因为计算了结果后显示框会清空,为了防止二次计算导致输入框也跟着清空,我们需要判断是否已经计算过结果,这时就用到变量 equal_is 。

当输入内容时,equal_is 变为 True,计算结果后,equal_is 变为 False,如果 equal_is == True,则不计算结果。

2.3 绑定键盘事件

我设置的键盘按键及其对应输入内容:

输入内容 对应按键
0~9 0~9
+ +
- -
* *
/ /
退格 BackSpace
清空 Delete
计算结果 Return(Enter键)

定义一个函数 bind_print,跟 text_print 有点相似,但有些不一样(原谅我技术差,不知道别的方法,只能重新定义一个函数):

def bind_print(event):  #函数键盘事件输入算式
    global textchange,equal_is
    if event.keysym!='Return':
        if event.keysym=='BackSpace':	#如果按键名等于“BackSpace”(退格键),那么就退格
            a=str(textchange)[0:-1]
            textchange=a
        elif event.keysym=='Delete':	#清空
            textchange=''
        else:
            textchange=str(textchange)+str(event.char)	#输入按键内容,char不会获得Ctrl,Shift等特殊按键的文本
        la.configure(text=textchange)	#显示内容
        show_is()	#判断是否错误
        equal_is=False
    else:
        text_equal()

如果按下的是特殊按键,除非是退格和回车,否则都不会有反应,

按下字母、数字、符号键的时候,输入按键内容。

接下来就是绑定键盘事件了:

root.bind('<Key>',bind_print)	#当键盘按下任意键,执行bind_print

这样,界面布置和功能就完成了‘

2.4 循环

将主窗体root放入主循环中:

root.mainloop()

3.全部代码

import tkinter as tk

def create_btn(text,col,row,cs,rs,pri='',px=(1,1),py=(1,1)):   #函数生成按钮
    if pri=='':
        t=text
    else:
        t=pri
    a=tk.Button(root,text=text,width=4,command=lambda:(text_print(t)))
    a.grid(column=col,row=row,columnspan=cs,rowspan=rs,padx=px,pady=py,sticky='nswe')
    return(a)

def grid_rowconfigure(*rows):   #函数填充行
    for i in rows:
        root.grid_rowconfigure(i,weight=1)

def grid_columnconfigure(*cols):    #函数填充列
    for i in cols:
        root.grid_columnconfigure(i,weight=1)

def bind_print(event):  #函数键盘事件输入算式
    global textchange,equal_is
    if event.keysym!='Return':
        if event.keysym=='BackSpace':
            a=str(textchange)[0:-1]
            textchange=a
        elif event.keysym=='Delete':
            textchange=''
        else:
            textchange=str(textchange)+str(event.char)
        la.configure(text=textchange)
        show_is()
        equal_is=False
    else:
        text_equal()

def text_print(x):  #函数按钮输入算式
    global textchange,equal_is
    if x!='=':
        if x=='←':
            a=str(textchange)[0:-1]
            textchange=a
        elif x=='C':
            textchange=''
        else:
            textchange=str(textchange)+str(x)
        la.configure(text=textchange)
        show_is()
        equal_is=False
    if x=='=':
        text_equal()

def text_equal(event=None):   #函数计算结果并上到输入框
    global textchange,equal_is
    if lab['text']!='错误' and equal_is==False:
        textchange=lab['text']
        la.configure(text=textchange)
        lab.configure(text='')
        equal_is=True

def show_is():     #显示框内容
    global textchange
    if textchange!='':
        try:
            textshow=eval(textchange)
        except (SyntaxError,TypeError,NameError):
            lab.configure(text='错误')
        else:
            lab.configure(text=textshow)
    else:
        lab.configure(text='')

root=tk.Tk()        #创建窗体
root.geometry('250x350')
root.title('计算器')
root.bind('<Key>',bind_print)

equal_is=False      #定义一些函数
textchange=''

la=tk.Label(root,text='',bg='white',fg='black',font=('宋体',24),anchor='w',relief='flat')  #生成输入框
la.grid(column=0,row=0,columnspan=5,rowspan=1,sticky='we')

lab=tk.Label(root,bg='white',fg='grey',height=1,font=('宋体',22),anchor='w',relief='flat')    #生成显示框
lab.grid(column=0,row=1,columnspan=5,rowspan=1,sticky='we')

btn={}                                  #生成按钮
btn['1']=create_btn('1',0,5,1,1)
btn['2']=create_btn('2',1,5,1,1)
btn['3']=create_btn('3',2,5,1,1)
btn['4']=create_btn('4',0,4,1,1)
btn['5']=create_btn('5',1,4,1,1)
btn['6']=create_btn('6',2,4,1,1)
btn['7']=create_btn('7',0,3,1,1)
btn['8']=create_btn('8',1,3,1,1)
btn['9']=create_btn('9',2,3,1,1)
btn['0']=create_btn('0',0,6,2,1)

btn['.']=create_btn('.',2,6,1,1)
btn['=']=create_btn('=',4,5,1,2)
btn['+']=create_btn('+',3,6,1,1)
btn['-']=create_btn('-',3,5,1,1)
btn['*']=create_btn('×',3,4,1,1,pri='*')
btn['/']=create_btn('÷',4,4,1,1,pri='/')
btn['←']=create_btn('←',1,2,1,1)

btn['C']=create_btn('C',2,2,1,1)
btn['(']=create_btn('(',3,2,1,1)
btn[')']=create_btn(')',4,2,1,1)
btn['**2']=create_btn('x²',3,3,1,1,pri='**2')
btn['**(-1)']=create_btn('1/x',4,3,1,1,pri='**(-1)')

grid_rowconfigure(2,3,4,5,6)
grid_columnconfigure(0,1,2,3,4)

root.mainloop()

4. 结束语

以上就是做一个简单计算器的过程,效果如开头所示。

本人技术还较差,欢迎向我提出任何的意见。

到此这篇关于如何利用python的tkinter实现一个简单的计算器的文章就介绍到这了,更多相关python tkinter简单计算器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2021-04-19

使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)

上一篇我们写了怎么将xmind转换成想要的excel格式,这篇再讲一下用Python自带的tkinter库设计一个简单的gui界面,让我们的xmind路径,用例版本执行等都通过这个gui界面来输入,生成我们需要的excel文件. Python要生成gui,库还是比较多的比如wxpython,这个我看了下,感觉比较难懂,毕竟只是设计一个比较简单的gui界面,所以就使用了tkinter库,感觉这个还是比较方便易懂的,大家可以在这里学习tkinter库http://c.biancheng.net/py

Python使用tkinter库实现文本显示用户输入功能示例

本文实例讲述了Python使用tkinter库实现文本显示用户输入功能.分享给大家供大家参考,具体如下: #coding:utf-8 from Tkinter import * class App: def __init__(self,root): #定义帧 frame = Frame(root) frame.pack() self.frame = frame w = Label(frame,text = "calculator") w.pack() self.newinput() #

python使用tkinter库实现五子棋游戏

本文实例为大家分享了python实现五子棋游戏的具体代码,供大家参考,具体内容如下 一.运行截图: 二.代码 # 用数组定义一个棋盘,棋盘大小为 15×15 # 数组索引代表位置, # 元素值代表该位置的状态:0代表没有棋子,1代表有黑棋,-1代表有白棋. from tkinter import * from tkinter.messagebox import * class Chess(object): def __init__(self): ############# # param # #

Python实战之用tkinter库做一个鼠标模拟点击器

前言 用Python做一个鼠标模拟点击器,可以实现多位置,定时,定次数,定区域随机位置点击,对于一些比较肝的游戏(痒痒鼠之类的),挂机非常有帮助,解放双手;定区域随机点击可以一定程度上防止系统检测出有使用脚本开挂的行为 import tkinter as tk import random import pyautogui as mouse from tkinter.messagebox import * 安装库 首先是今天要用到的几个必要的库:tkinter,random,pyautogui 没

python自带tkinter库实现棋盘覆盖图形界面

python实现棋盘覆盖图形界面,供大家参考,具体内容如下 一.解决方案和关键代码 工具: python tkinter库 问题描述:   在一个2^k×2^k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有4^k种情形.因而对任何k≥0,有4^k种不同的特殊棋盘.   在棋盘覆盖问题中,要用下图中 4 中不同形态的 L 型骨牌覆盖一个给定的特殊棋牌上除特殊方格以外的所有方格,且任何 2 个 L 型骨牌不得重叠覆盖

Python中tkinter的用户登录管理的实现

内容 编写一个用户登录管理程序,设计窗体的布局,制定密码规则和验证码规则.要求使用 Python 标准库 tkinter 编写基于GUI 的用户登录窗体.通过该窗体,用户输入用户名.密码和验证码等信息,确认登录后需要判断用户信息是否合法,并弹出对应的反馈信息.通过判断用户是否在用户信息中,以及输入密码是否与用户信息文件中用户名所对应的密码是否相同,来判断用户是否合法.此外,新用户还可以进行注册,注册需要输入用户名.密码.手机号和身份证号等信息.注册时密码需要遵循一定规则(长度不小于8且含有数字.

Python聊天室带界面实现的示例代码(tkinter,Mysql,Treading,socket)

一.前言 我用的是面向对象写的,把界面功能模块封装成类,然后在客户端创建对象然后进行调用.好处就是方便我们维护代码以及把相应的信息封装起来,每一个实例都是各不相同的. 所有的界面按钮处理事件都在客户端,在创建界面对象是会把客户端的处理事件函数作为创建对象的参数,之后再按钮上绑定这个函数,当点击按钮时便会回调函数 二.登录界面实现 登录界面模块chat_login_panel.py from tkinter import * # 导入模块,用户创建GUI界面 # 登陆界面类 class Login

python tkinter实现定时关机

本文实例为大家分享了python tkinter实现定时关机的具体代码,供大家参考,具体内容如下 很早以前写的,懒得修改,代码很简单,适合初学者 运行效果图如下: 使用注意 设定时间后点击开始即可实现定时关机,同时窗口也会关闭 想要取消关机的话,再次打开,点取消即可 代码如下 import os,time # import multiprocessing import threading from tkinter import * from tkinter import ttk import t

python基于tkinter制作m3u8视频下载工具

这是我为了学习tkinter用python 写的一个下载m3u8视频的小程序,程序使用了多线程下载,下载后自动合并成一个视频文件,方便播放. 目前的众多视频都是m3u8的播放类型,只要知道视频的m3u8地址,就可以完美下载整个视频. m3u8地址获取 打开浏览器,点开你要获取地址的视频 重要的来了,右键>>审查元素或者按F12也可以 根据开发或测试的实际环境选择相应的设备,选择iphone6 plus 选择好了以后,刷新页面,点击漏斗,选择media,一定刷新之后再点击,没出来的话切换几下选项

python tkinter库实现气泡屏保和锁屏

本文实例为大家分享了python tkinter库实现气泡屏保和锁屏的具体代码,供大家参考,具体内容如下 显示效果如下: 代码: import random import tkinter import threading from ctypes import * class RandomBall(object): """ 定义关于球的类 """ def __init__(self, canvas, screen_width, screen_hei

python基于Tkinter库实现简单文本编辑器实例

本文实例讲述了python基于Tkinter库实现简单文本编辑器的方法.分享给大家供大家参考.具体实现方法如下: ## {{{ http://code.activestate.com/recipes/578568/ (r1) from Tkinter import * from tkSimpleDialog import askstring from tkFileDialog import asksaveasfilename from tkMessageBox import askokcance

Python基于jieba库进行简单分词及词云功能实现方法

本文实例讲述了Python基于jieba库进行简单分词及词云功能实现方法.分享给大家供大家参考,具体如下: 目标: 1.导入一个文本文件 2.使用jieba对文本进行分词 3.使用wordcloud包绘制词云 环境: Python 3.6.0 |Anaconda 4.3.1 (64-bit) 工具: jupyter notebook 从网上下载了一篇小说<老九门>,以下对这篇小说进行分词,并绘制词云图. 分词使用最流行的分词包jieba,参考:https://github.com/fxsjy/

python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)

最近又回顾了下Websocket,发现已经忘的七七八八了.于是用js写了客户端,用python写了服务端,来复习一下这方面的知识. 先看一下python简单聊天工具最终效果 一个客户端连上服务的并发送消息 另一个客户端连上服务的并发送消息 服务的收到客户端的全部消息并返回消息 一个客户端掉线并不影响其它socket连接 列取全部连接客户端对象和当前发消息的客户端对象 先安装websockets pip install websockets python简单聊天工具实例源码 Python聊天工具服

python基于pdfminer库提取pdf文字代码实例

安装pdfminer 库 windows 下安装pdfminer3k pip install pdfminer3k Liunx 下安装pdfminer pip install pdfminer 代码 from pdfminer.pdfparser import PDFParser, PDFDocument from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LAParams, LTTextBox

Python基于Matplotlib库简单绘制折线图的方法示例

本文实例讲述了Python基于Matplotlib库简单绘制折线图的方法.分享给大家供大家参考,具体如下: Matplotlib画折线图,有一些离散点,想看看这些点的变动趋势: import matplotlib.pyplot as plt x1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] y1=[30,31,31,32,33,35,35,40,47,62,99,186,480] x2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1

Python基于sklearn库的分类算法简单应用示例

本文实例讲述了Python基于sklearn库的分类算法简单应用.分享给大家供大家参考,具体如下: scikit-learn已经包含在Anaconda中.也可以在官方下载源码包进行安装.本文代码里封装了如下机器学习算法,我们修改数据加载函数,即可一键测试: # coding=gbk ''' Created on 2016年6月4日 @author: bryan ''' import time from sklearn import metrics import pickle as pickle

Python基于identicon库创建类似Github上用的头像功能

本文实例讲述了Python基于identicon库创建类似Github上用的头像功能.分享给大家供大家参考,具体如下: Identicon在很多大型IT网站上可以见到,比如Github,Sourceforge,Stackoveflow等等, 刚刚注册的账号的个人信息的默认图标​都​是​一​些​看​上​去​像​七​巧​板​拼​凑​的​图​案​,​对​称​又​变​化​多​端​. 本​人​也​是​因​为​好​奇​才​在​网​上​搜​了​这​个​算​法​,​主​要​是​哈​希​算​法​,​把​邮​箱​或

Python基于OpenCV库Adaboost实现人脸识别功能详解

本文实例讲述了Python基于OpenCV库Adaboost实现人脸识别功能.分享给大家供大家参考,具体如下: 以前用Matlab写神经网络的面部眼镜识别算法,研究算法逻辑,采集大量训练数据,迭代,计算各感知器的系数...相当之麻烦~而现在运用调用pythonOpenCV库Adaboost算法,无需知道算法逻辑,无需进行模型训练,人脸识别变得相当之简单了. 需要用到的库是opencv(open source computer vision),下载安装方式如下: 使用pip install num