Python大作业之TK计算器

import math
from tkinter import Tk, Button, Text


# add_word 函数用于添加字符到文本框
def add_word(c):
    # 使用try except语句,防止用户输入非法字符,捕获异常
    try:
        # '0.0' 表示文本开头位置
        # 'end' END索引号表示文本末尾位置
        # 那么从 '0.0' 到 'end' 表示把整个文本框的内容获取下来
        exp = txt.get('0.0', 'end')
        # 如果文本框的内容为出错的内容,则清空文本框
        if exp.find("出错啦!") != -1:
            txt.replace('0.0', 'end', '')

        # 如果点击的是等于号,则计算表达式的值
        if c == '=':
            # 然后把整个文本框内容替换为计算结果
            txt.replace('0.0', 'end', eval(exp))
        else:
            # 'end' END索引号表示在最后插入内容
            txt.insert('end', c)
    except Exception as e:
        # 如果出现异常,则把文本框内容替换为出错信息
        txt.replace('0.0', 'end', '出错啦!请重新输入!\n错误信息如下:\n' + str(e))


# handler 函数用于处理按钮的点击事件
def handler(fun, c):
    # lambda 语法为:lambda 参数列表:运算表达式
    # 这里fun=fun,c=c为参数列表,fun(c)为运算表达式
    # 即创建一个lambda表达式,该表达式的功能为:调用fun函数,传入参数c
    # 当点击按钮时,就会调用该lambda表达式,把对应按钮的字符传入,比如数字或者运算符。
    return lambda fun=fun, c=c: fun(c)


# 创建Tk对象,即窗口对象
root = Tk()

# 设置窗口标题
root.title("计算器")

# 创建一个按钮标题数组,包含哪一些按钮
text_arr = ['1', '2', '3', '+', '4', '5', '6', '-', '7', '8', '9', '*', '.', '0', '=', '/']

# 按钮列数、按钮宽度、高度、页面边距、按钮间边距、文本框高度
n_col, bw, bh, padding, space, th = 4, 50, 30, 20, 10, 100

# 根据按钮列数,推算出按钮行数
n_row = math.ceil(len(text_arr) * 1.0 / n_col)

# 布局宽度 = 所有按钮总宽度 + 页面两边的边距 + 按钮之间的距离 = (按钮宽度 * 按钮列数) + (页面边距 * 2) + (按钮间边距 * (按钮列数 - 1))
width = (bw * n_col) + (padding * 2) + (space * (n_col - 1))

# 布局高度 = 文本框高度 + 所有按钮总高度 + 页面上下两边的边距 + 按钮上下行之间的距离
# = 文本框高度 + (按钮高度 * 按钮行数) + (页面边距 * 3) + (按钮间边距 * (按钮行数 - 1))
height = th + (bh * n_row) + (padding * 3) + (space * (n_row - 1))

# 画出窗口大小,宽度为width,高度为height,即 width * height
root.geometry("%sx%s" % (width, height))

# 创建一个本文框,用于显示计算结果
txt = Text(root)

# 设置文本框的宽度为width,高度为th,宽度为单行按钮总宽度+按钮间距总宽度
txt.place(x=padding, y=padding, width=bw * n_col + space * (n_col - 1), height=th)

# 把按钮标题数组中的每一个元素,都创建一个按钮,渲染到窗口上
for index in range(len(text_arr)):
    # row_index 为按钮所在行的索引,从0开始,通过取余%的方式,计算出按钮所在行的索引
    # col_index 为按钮所在列的索引,从0开始,通过取整//的方式,计算出按钮所在列的索引
    row_index, col_index = (index % n_col), (index // n_col)  # 行序号、列序号

    # 创建一个按钮对象到root窗口,按钮标题为text_arr[index]
    # 点击按钮后,通过handler函数,将当前数字或者运算符作为参数,传递给add_word函数并执行。
    btn = Button(root, text=text_arr[index], command=handler(add_word, text_arr[index]))

    # 计算按钮的x坐标,公式为:页面左边距 + (按钮宽度 + 按钮间距) * 按钮所在行的索引
    x = padding + row_index * (bw + space)
    # 计算按钮的y坐标,公式为:文本框高度 + 页面上边距和文本框下边距 + (按钮高度 + 按钮间距) * 按钮所在列的索引
    y = (th + padding * 2) + col_index * (bh + space)

    # 渲染按钮到窗口上,按钮的宽度为bw,高度为bh
    btn.place(x=x, y=y, width=bw, height=bh)

# mainloop 使程序进入主循环,窗口一直不断渲染,等待用户操作,不会结束程序
root.mainloop()

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值