使用python的tkinter模块制作一个计算器

2023-10-29

使用tkinter模块制作的一个简单的计算器
由于刚学这个模块,所以做的不是很好
截图:
点击计算后算式区的值会改成结果,可自行在数字触发的函数中添加数字输入就进行计算回显的功能
在这里插入图片描述

在这里插入图片描述

代码如下:

import tkinter as tk
import tkinter.messagebox as message

window = tk.Tk()
window.title('不成熟的计算器')
# 宽280,高350
# 不设置宽高,大小自动跟随内部控件
# window.geometry('250x280')
window['background'] = 'blue'
# 窗体禁止缩放
window.resizable(width=False, height=False)
# 计算公式
show_formula = tk.StringVar()
# 计算结果
show_result = tk.StringVar()

# 创建显示算数栏
# 需要指定宽度  否者  会随着输入的字符增多被拉长
# 用来显示要计算的算式
formulaLabel = tk.Label(window, height=1, width=4, textvariable=show_formula,
                        justify=tk.LEFT, anchor='se', font=('正楷', 12))
formulaLabel.grid(row=0, column=0, columnspan=4, sticky=tk.W + tk.E)
# 用来展示结果
calculationResultsLabel = tk.Label(window, height=2, width=4, textvariable=show_result,
                                   justify=tk.LEFT, anchor='se', font=('正楷', 19))
calculationResultsLabel.grid(row=1, column=0, columnspan=4, sticky=tk.W + tk.E)


# 用来创建按钮
# row             行
# column          列
# operator        操作符(例如:+)
# text            控件名称
# columnspan      占几列
# width           宽度
def createButton(row, column, operator, text, columnspan=None, width=5):
    button = tk.Button(window, command=lambda: cal(operator),
                       width=width, text=text, font=('正楷', 15))
    if columnspan is None:
        button.grid(row=row, column=column, padx=2, pady=4)
    else:
        button.grid(row=row, column=column, columnspan=columnspan, padx=2, pady=4)


# 第一行按钮
createButton(2, 0, '1', '1')
createButton(2, 1, '2', '2')
createButton(2, 2, '3', '3')
createButton(2, 3, '+', '+')
# 第二行按钮
createButton(3, 0, '4', '4')
createButton(3, 1, '5', '5')
createButton(3, 2, '6', '6')
createButton(3, 3, '-', '-')
# 第三行按钮
createButton(4, 0, '7', '7')
createButton(4, 1, '8', '8')
createButton(4, 2, '9', '9')
createButton(4, 3, '*', '*')
# 第四行按钮
createButton(5, 0, '0', '0')
createButton(5, 1, '.', '.')
createButton(5, 2, 'back', 'back')
createButton(5, 3, '/', '/')
# 第五行按钮
createButton(6, 0, 'clear', '清 空', columnspan=2, width=12)
createButton(6, 2, '=', '计 算', columnspan=2, width=12)

# 用来保存结果
formula = ''


# 点击按钮调用的函数
def cal(key):
    global formula
    # 已经有的前一个key 例如1+2+ already_key为+
    already_key = ''
    # 截取算式最后一位,后面需要判断最后一位是否是运算符
    if len(formula) > 0:
        already_key = formula[-1]
    # 下面的* /处理代码是类似的  为了便于理解分开了
    # 加
    if key == '+':
        if formula != '':
            # 如果前面是*或者/就将其改成+
            if already_key == '*' or already_key == '/' or already_key == '.':
                formula = formula[0:-1] + key
            elif already_key != '+' and already_key != '-' and already_key != '':
                formula += key
    elif key == '-':
        if already_key == '-':
            formula = formula[0:-1] + '+'
        elif already_key == '+' or already_key == '.':
            formula = formula[0:-1] + '-'
        else:
            formula += key
    # 除法和乘法还要判断倒数第二个是不是* /号
    elif key == '*':
        if formula != '':
            # 如果最后一个为+ - / .的话
            if already_key == '+' or already_key == '-' or already_key == '/' or already_key == '.':
                # 如果算式长于大于等于2位
                if len(formula) >= 2:
                    # 如果倒数第二个字符不是*或者/   防止出现* /之后再输入*的事件  跟后面减法(-)处理有关联
                    if formula[-2] != '*' and formula[-2] != '/':
                        formula = formula[0:-1] + key
                else:
                    formula = formula[0:-1] + key
            # 如果前面是数字就可以直接添加到最后
            elif already_key != key:
                formula += key
    elif key == '/':
        if formula != '':
            if already_key == '+' or already_key == '-' or already_key == '*' or already_key == '.':
                if len(formula) >= 2:
                    if formula[-2] != '*' and formula[-2] != '/':
                        formula = formula[0:-1] + key
                else:
                    formula = formula[0:-1] + key
            elif already_key != key:
                formula += key
    # 输入点的时候
    elif key == '.':
        # 如果最后一个不是运算符和.则添加到最后一个
        if formula != '' and already_key != '+' and already_key != '-' \
                and already_key != '*' and already_key != '/' and already_key != '.':
            formula += key
    elif key == '=':
        # 进行计算  计算要做出错处理 要判断最后一个是不是运算符号
        if len(formula) < 1:
            pass
        elif already_key != '*' and already_key != '/' and already_key != '+' \
                and already_key != '-':
            try:
                # 通过eval函数计算
                v = eval(formula)
                show_result.set(v)
                # 如果计算之后,讲算式改成结果  eval返回值是int类型  所以要转为字符型复制给暂存
                formula = str(v)
                show_formula.set(v)
            except ZeroDivisionError:
                message.showerror(title='警告', message='除数不能为0')
        else:
            message.showinfo(title='温馨提示', message='请检查您的公式,最后一个不能为运算符!')
    elif key == 'clear':
        # 清空显示区
        show_formula.set('')
        show_result.set('')
        # 清空暂存区
        formula = ''
    elif key == 'back':
        # 删除
        if len(formula) >= 1:
            formula = formula[0:-1]
    else:
        # 这里输入的全是数字
        formula += key
    show_formula.set(formula)


window.mainloop()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用python的tkinter模块制作一个计算器 的相关文章

随机推荐

  • 完美解决eclipse中文注释错位、缩进、被放大BUG

    完美解决eclipse中文注释错位 缩进 被放大BUG 1 常规操作 2 另辟蹊径 2 1 基本思路 字体融合法 2 2 操作步骤 2 2 1 软件准备 2 2 2 文件准备 2 2 3详细步骤 3 写在最后 1 常规操作 这个BUG有大量
  • C++数组

    C 支持数组数据结构 它可以存储一个固定大小的相同类型元素的顺序集合 数组是用来存储一系列数据 但它往往被认为是一系列相同类型的变量 一维数组 一维数组定义的三种方式 1 数据类型 数组名 数组长度 2 数据类型 数组名 数组长度 值1 值
  • 总经理、总裁、总监、首席执行官,谁最了不起?

    总经理 总裁 总监 首席执行官 谁最了不起 中国的 头衔贬值 日趋严重 在中国 近来突然发现身边多了很多只有数名员工的 总裁 或者只管记帐的 财务总监 当然 在中国想要办点儿事 依靠个人的权限与力量是很关键的 因此也造成了这种刻意显示 自己
  • 如何把Eclipse改成中文版

    一 打开浏览器 输入http www eclipse org babel downloads php 如图所示 Babel Language 开头的一栏下面就是各个eclise版本的语言包 此处以Indigo版为例 二 目标锁定 Babel
  • Python 录入学生信息 提示用户在控制台输入3个学生的信息,学生信息包含姓名、年龄

    需求 按照以下要求完成代码的编写 第一步 录入学生信息 1 提示用户在控制台输入3个学生的信息 学生信息包含姓名 年龄 2 要求 封装录入单个学生信息的函数 并返回学生的信息 第二步 展示学生列表信息 1 封装打印学生信息的函数 格式要求如
  • sql sever——创建数据库

    创建数据库 并且指定存储数据库的主数据文件和日志文件 USE master GO CREATE DATABASE BOOK ON PRIMARY 主数据文件组primary NAME book data 主数据文件逻辑文件名 FILENAM
  • 力扣练习题(数组中数据反转)

    力扣练习题 数组中数据反转 要求 int arr 12 23 34 45 56 67 78 89 90 变为 int arr 90 89 78 67 56 45 34 23 12 思路 1 定义一个数组用静态初始化完成元素的初始化 2 循环
  • 剑指 Offer 39. 数组中出现次数超过一半的数字--java解法和心得

    class Solution public int majorityElement int nums 给数组排序 Arrays sort nums 排序后所找的元素比在中间 return nums nums length 2 拓展解法 摩根
  • 线程中断标志位 interrupt()、interrupted()、isInterrupted() 的认识

    常见问题 首先你是怎么去关闭一个开启的线程 调用中断方法之后 线程就立即停止运行吗 带着这两个问题探讨一下 主要围绕着这三个方法讲述 interrupt interrupted isInterrupted 归类为中断 什么是中断标识位 首先
  • 在js中forEach中使用try catch捕获异常

    forEach跳出循环使用try catch 这是我们都知道的 但是今天使用的时候发现出了问题 一 forEach中使用try catch捕获异常 如下图 1 正常情况下try catch是可以捕获到throw里面的内容 并且不会报错 程序
  • 二进制部署K8S

    目录 一 环境准备 1 常见的k8s部署方式 2 关闭防火墙 3 关闭selinux 4 关闭swap 5 根据规划设置主机名 6 在master添加hosts 7 将桥接的IPv4流量传递到iptables的链 8 时间同步 二 部署et
  • wireshark工具使用心得

    抓http包 但是protocal全部为tcp 并且Info也没有解析为http 打开 Edit Preferences 选择Protocals 选择http 在 tcp ports 中加入http端口 抓包数据不完整 清除浏览器缓存 再抓
  • 判断机器IP是公网ip还是内网ip

    首先是恭喜开通blog 对于ip是否是公网ip 网上已经有很多文章进行了描述 但我每次都记不太住 总要查找一下才又清楚 因此决定在这里记录下来 方便以后查询 ip地址分为五类 E类为保留为今后使用 D类为组播地址 用于主机网络地址的就是A类
  • windows套接字I/0模型-IOCP完成端口模型

    在 Windows 网络编程中 IOCP Input Output Completion Port 是一种高性能的 I O 模型 可以使应用程序能够处理大量并发 I O 操作 IOCP 模型主要通过事件通知和回调函数来处理异步 I O 操作
  • 最长01交替子串(浪潮笔试题)

    题意 给一个只有0和1的字符串 允许反转一个连续区间 即0变成1 1变成0 求最长的01交替串多长 允许不连续 我最先想到的是动态规划解法 状态设计方面 首先一个串的状态会有以0结尾和以1结尾两种 然后题目中说允许反转一个连续区间 那么根据
  • 【JavaEE】_JavaScript(WebAPI)

    目录 1 DOM 1 1 DOM基本概念 1 2 DOM树 2 选中页面元素 2 1 querySelector 2 2 querySelectorAll 3 事件 3 1 基本概念 3 2 事件的三要素 3 3 示例 4 操作元素 4 1
  • vue3使用高德地图完成标注点聚合

  • Linux内核提权漏洞CVE-2023-32233复测及POC脚本

    近日 研究人员发现了Linux内核的NetFilter框架中的新漏洞 CVE 2023 32233 该漏洞可被本地用户用于将权限提升为root 并完全控制系统 问题的根源在于tfilter nf tables是如何处理批处理请求的 经过身份
  • C++引用(&)解析:引用的作用,什么时候使用引用,引用与指针的不同

    引用是什么 什么时候使用引用 做函数的参数 做函数的返回值 引用与指针的不同 引用是什么 引用是变量的别名 理论上不开辟新的空间 符号 是类型标识符的一部分 被引用的数据类型 变量名称 如下图中 变量a 与变量ra 指向同一块内存空间 由此
  • 使用python的tkinter模块制作一个计算器

    使用tkinter模块制作的一个简单的计算器 由于刚学这个模块 所以做的不是很好 截图 点击计算后算式区的值会改成结果 可自行在数字触发的函数中添加数字输入就进行计算回显的功能 代码如下 import tkinter as tk impor