Python+ tkinter实现小学整数乘法和除法竖式演算式

Python+ tkinter实现小学整数乘法和除法竖式演算式

整数的乘法与除法是小学数学中的重要内容,它们是数学运算中的基础部分。 本文将使用python 和Python 的标准 GUI(图形用户界面)包tkinter,实现整数乘法与除法的竖式演示。供有兴趣的读者测试完善。

一、小学整数乘法竖式演算式

界面上有两个整数输入框,单击"计算"按钮,显示小学生整数演示竖式,效果图:

源码如下:

python 复制代码
import tkinter as tk
from tkinter import messagebox

# 乘法计算函数
def multiply(factor1, factor2):
    lines = []  # 存储每一行的内容
    len1 = len(factor1)
    len2 = len(factor2)
    carry = 0  # 进位值
    product = 0  # 单个乘积

    # 添加第一行(第一个因数)
    lines.append(f"{factor1}\n")
    # 添加第二行(第二个因数)
    lines.append(f"x{factor2.rjust(len1)}\n")
    lines.append("-" * (len1 + len2) + "\n")  # 分隔线

    # 竖式计算
    for j in range(len2 - 1, -1, -1):
        line = ""
        carry = 0
        for i in range(len1 - 1, -1, -1):
            product = int(factor1[i]) * int(factor2[j]) + carry
            carry = product // 10
            line = str(product % 10) + line
        if carry > 0:
            line = str(carry) + line
            carry = 0
        line += "0" * (len2 - 1 - j)  # 对齐
        lines.append(line.rjust(len1 + len2) + "\n")

    # 计算最终结果的长度
    final_result = str(int(factor1) * int(factor2))
    max_length = max(len(line.strip()) for line in lines)

    # 添加最终分隔线
    lines.append("-" * max_length + "\n")
    # 添加最终结果(右对齐)
    lines.append(final_result.rjust(max_length) + "\n")

    return "".join(lines)

# GUI计算函数
def calculate():
    factor1 = entry_factor1.get()
    factor2 = entry_factor2.get()

    if not factor1 or not factor2:
        messagebox.showwarning("输入错误", "请输入两个因数!")
        return

    try:
        result = multiply(factor1, factor2)
        result_text.delete(1.0, tk.END)  # 清空结果文本框
        result_text.insert(tk.END, result)  # 显示结果
    except ValueError:
        messagebox.showwarning("输入错误", "请输入有效的整数!")

# GUI界面设置
root = tk.Tk()
root.title("整数乘法竖式演算式")
root.geometry("400x500")
root.configure(bg="#4682B4")

# 容器框架
container = tk.Frame(root, bg="#4682B4")
container.pack(pady=20)

# 标题
label_title = tk.Label(container, text="小学整数乘法竖式演算", font=("Courier New", 18), bg="#4682B4", fg="#dbc5c5")
label_title.pack()

# 输入框(因数1)
entry_factor1 = tk.Entry(container, font=("Courier New", 18), width=20, justify="right", bd=0, bg="white")
entry_factor1.pack(pady=10)

# 输入框(因数2)
entry_factor2 = tk.Entry(container, font=("Courier New", 18), width=20, justify="right", bd=0, bg="white")
entry_factor2.pack(pady=10)

# "计算"按钮
button_calculate = tk.Button(container, text="计算", font=("Courier New", 18), bg="#98FB98", fg="#4682B4", bd=0,
                             command=calculate)
button_calculate.pack(pady=10)

# "结果"文本框
result_text = tk.Text(container, font=("Courier New", 14), width=30, height=15, bd=0, bg="white", fg="#4682B4")
result_text.pack(pady=10)

# GUI主循环
root.mainloop()

二、小学整数除法竖式演算式

界面上有两个整数输入框每次单击"计算"按钮,要显示小学数学整数整除竖式效果。效果图:

源码如下:

python 复制代码
import tkinter as tk
from tkinter import messagebox

def division_steps(dividend, divisor):
    steps = []
    dividend_str = str(dividend)
    dividend_len = len(dividend_str)
    temp_dividend = 0
    current_position = 0
    result_started = False  # 标记是否已经开始有效计算

    while current_position < dividend_len:
        temp_dividend = temp_dividend * 10 + int(dividend_str[current_position])
        current_position += 1

        # 如果当前部分不足以进行除法,则跳过该步骤
        if temp_dividend < divisor:
            continue

        # 标记已经开始有效计算
        result_started = True

        quotient_digit = temp_dividend // divisor
        subtrahend = divisor * quotient_digit
        remainder = temp_dividend - subtrahend

        # 计算缩进
        # 缩进 = 除数长度 + 3(用于" ) ") + 当前被除数部分的偏移量 - 1(对齐被除数的第一个有效数字)
        indent = len(str(divisor)) + 3 + (current_position - len(str(subtrahend)) - 1)
        
        # 特殊处理第一步:避免显示多余的被减数和减法内容
        if len(steps) == 0:  # 第一条竖式步骤
            step_str = f"{' ' * indent}-{subtrahend}\n"   # 减去的值
            step_str += f"{' ' * indent}{'-' * len(str(subtrahend))}\n"  # 减号线条
        else:  # 后续步骤正常缩进
            step_str = f"{' ' * (indent + 1)}{temp_dividend}\n"  # 当前部分被减数,此处需要 + 1
            step_str += f"{' ' * indent}-{subtrahend}\n"   # 减去的值
            step_str += f"{' ' * indent}{'-' * len(str(subtrahend))}\n"  # 减号线条
        
        steps.append(step_str)
        
        temp_dividend = remainder

    return steps, temp_dividend  # 返回步骤和最终的余数

def calculate():
    result_text.delete(1.0, tk.END)  # 清空结果文本框
    dividend = dividend_entry.get()  # 获取被除数输入
    divisor = divisor_entry.get()    # 获取除数输入
    
    try:
        dividend = int(dividend)     # 将被除数转换为整数
        divisor = int(divisor)       # 将除数转换为整数
        
        if divisor == 0:
            raise ValueError("除数不能为零")  # 除数为零时抛出异常
    except ValueError:
        messagebox.showwarning("输入错误", "请输入有效的整数,且除数不能为零")  # 弹出警告对话框
        return

    steps, remainder = division_steps(dividend, divisor)  # 计算除法步骤和余数
    dividend_str = str(dividend)              # 被除数字符串
    divisor_str = str(divisor)                # 除数字符串
    quotient = dividend // divisor            # 计算商
    quotient_str = str(quotient)              # 商的字符串表示

    result_text.config(state=tk.NORMAL)  # 设置文本框为可编辑状态

    # 计算商的对齐位置
    # 商的第一位应该与被除数的第一个有效数字对齐
    # 除数长度 + 3(用于" ) ") + 被除数长度 - 商长度
    indent_quotient = len(divisor_str) + 3 + (len(dividend_str) - len(quotient_str))
    result_text.insert(tk.END, f"{' ' * indent_quotient}{quotient_str}\n")
    
    # 显示除数和被除数的格式化表示
    result_text.insert(tk.END, f"{divisor_str} ) {dividend_str}\n")

    # 显示除法步骤,格式化输出
    for step in steps:
        result_text.insert(tk.END, step)

    # 显示竖式的余数
    #result_text.insert(tk.END, f" {remainder}\n")
    # 计算余数的缩进,使其与商的末尾对齐
    # 余数的缩进 = 商的对齐缩进 + 商的长度 - 余数的长度
    indent_remainder = indent_quotient + len(quotient_str) - len(str(remainder))
    result_text.insert(tk.END, f"{' ' * indent_remainder}{remainder}\n")

    # 显示最终的商和余数
    result_text.insert(tk.END, f"商: {quotient}, 余数: {remainder}\n")

    #result_text.config(state=tk.DISABLED)  # 设置文本框为只读状态

# 创建主窗口
root = tk.Tk()
root.title("整数除法竖式演算")
root.geometry("450x500")
root.configure(bg="#4682B4")  # 设置背景颜色

# 创建框架,用于容纳其他控件
frame = tk.Frame(root, bg="#4682B4")
frame.pack(pady=20)

# 被除数标签和输入框
dividend_label = tk.Label(frame, text="被除数:", bg="#4682B4", fg="white", font=("Courier", 14))
dividend_label.grid(row=0, column=0, padx=10, pady=5)
dividend_entry = tk.Entry(frame, width=15, justify="right", font=("Courier", 14))
dividend_entry.grid(row=0, column=1, padx=10, pady=5)

# 除数标签和输入框
divisor_label = tk.Label(frame, text="除数:", bg="#4682B4", fg="white", font=("Courier", 14))
divisor_label.grid(row=1, column=0, padx=10, pady=5)
divisor_entry = tk.Entry(frame, width=15, justify="right", font=("Courier", 14))
divisor_entry.grid(row=1, column=1, padx=10, pady=5)

# 计算按钮
calculate_button = tk.Button(frame, text="计算", command=calculate, bg="#98FB98", fg="#4682B4", font=("Courier", 14))
calculate_button.grid(row=2, column=0, columnspan=2, pady=10)

# 结果文本框
result_text = tk.Text(frame, width=40, height=20, font=("Courier", 12), wrap=tk.NONE)
result_text.grid(row=4, column=0, columnspan=2)

root.mainloop()  # 进入主事件循环

OK!

相关推荐
史嘉庆9 分钟前
Pandas数据分析 【Series | DataFrame】
python·数据挖掘·数据分析·pandas
Linux520小飞鱼11 分钟前
C++语言的数据结构
开发语言·后端·golang
湫兮之风21 分钟前
C++: Dtrees:load(constg String& filepath, const String& nodeName)中nodeName参数含义
开发语言·c++·算法
tan77º30 分钟前
【AcWing】蓝桥杯辅导课-递归与递推
开发语言·c++·笔记·算法·蓝桥杯
清图33 分钟前
Python预训练视觉和大语言模型——精彩试读
人工智能·python·语言模型
爱吃喵的鲤鱼37 分钟前
Linux——线程条件变量(同步)
java·开发语言
忆白T043 分钟前
browser-use 的简单使用
python·语言模型
小李飞飞砖1 小时前
kotlin的协程的基础概念
开发语言·前端·kotlin
007php0071 小时前
go语言zero框架通过chromedp实现网页在线截图的设计与功能实现
java·开发语言·后端·python·docker·云原生·golang
蚂蚁质量1 小时前
什么是 Java 虚拟机(JVM)?
java·开发语言·jvm