You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Tkinter的计算器浮点数功能实现技术求助

完善Tkinter计算器的浮点数运算功能

问题分析

原代码存在以下影响浮点数功能的问题:

  • 所有运算触发函数(加法、减法等)中,强制将first_number转为int,导致输入的浮点数被截断
  • float_number()函数未做重复小数点校验,会出现5..2这类无效输入
  • 等号运算逻辑只处理整数,未兼容浮点数运算

修改方案

  1. 统一数值类型转换:将所有运算触发函数里的int(first_number)改为float(first_number),同时支持整数和浮点数存储
  2. 修复小数点重复输入问题:在float_number()中检查当前输入是否已包含小数点,仅当未包含时才插入
  3. 兼容浮点数运算:button_equal()中把int(second_number)改为float(second_number),统一处理整数和浮点数运算
  4. 优化显示体验:计算平方根和运算结果时,若结果为整数则显示整数格式,否则显示浮点数;添加除零错误处理

修改后的完整代码

from tkinter import *
from math import *

root = Tk()
root.title("Calculator")
e = Entry(root, width=25, borderwidth=30)
e.grid(row=0, column=0, padx=10, pady=15, columnspan=3)

# BUTTONS
def button_click(number):
    current = e.get()
    e.delete(0, END)
    e.insert(0, str(current) + str(number))

def button_clear():
    e.delete(0, END)

def button_clear_one_char():
    if len(e.get()) > 0:
        e.delete(len(e.get())-1)

def button_addition():
    global first_number
    global dividor 
    dividor = "addition"
    first_number = float(e.get())
    e.delete(0, END)

def button_substraction():
    global first_number
    global dividor 
    dividor = "substract"
    first_number = float(e.get())
    e.delete(0, END)

def button_multiplication():
    global first_number 
    global dividor 
    dividor = "multiply"
    first_number = float(e.get())
    e.delete(0, END)

def button_division():
    global first_number 
    global dividor 
    dividor = "division"
    first_number = float(e.get())
    e.delete(0, END)

def button_root_number():
    number = float(e.get())
    result = number ** 0.5
    e.delete(0, END)
    e.insert(0, int(result) if result.is_integer() else result)

def button_equal():
    global first_number 
    global dividor
    second_number = float(e.get())
    e.delete(0, END)

    if dividor == "addition":
        result = first_number + second_number
    elif dividor == "substract":
        result = first_number - second_number
    elif dividor == "multiply":
        result = first_number * second_number
    elif dividor == "division":
        result = first_number / second_number if second_number != 0 else "Error"
    else:
        result = ""
    
    if isinstance(result, float) and result.is_integer():
        e.insert(0, int(result))
    else:
        e.insert(0, result)

def float_number():
    current = e.get()
    if "." not in current:
        e.delete(0, END)
        e.insert(0, current + ".")

# 按钮创建
button_9 = Button(root,text="9",padx=49,pady=20, command=lambda:button_click(9))
button_8 = Button(root,text="8",padx=49,pady=20, command=lambda:button_click(8))
button_7 = Button(root,text="7",padx=49,pady=20, command=lambda:button_click(7))
button_6 = Button(root,text="6",padx=49,pady=20, command=lambda:button_click(6))
button_5 = Button(root,text="5",padx=49,pady=20, command=lambda:button_click(5))
button_4 = Button(root,text="4",padx=49,pady=20, command=lambda:button_click(4))
button_3 = Button(root,text="3",padx=49,pady=20, command=lambda:button_click(3))
button_2 = Button(root,text="2",padx=49,pady=20, command=lambda:button_click(2))
button_1 = Button(root,text="1",padx=49,pady=20, command=lambda:button_click(1))
button_0 = Button(root,text="0",padx=49,pady=20, command=lambda:button_click(0))
button_cl = Button(root,text="Clear",padx=39,pady=20,command=button_clear)
button_addi = Button(root,text="+",padx=49,pady=20,command=button_addition)
button_substr = Button(root,text="-",padx=49,pady=20,command=button_substraction)
button_eq = Button(root,text="=",padx=49,pady=20,command=button_equal)
button_multiply = Button(root,text="*",padx=49,pady=20,command=button_multiplication)
button_divi = Button(root,text="/",padx=49,pady=20,command=button_division)
button_point = Button(root,text=".",padx=49,pady=20,command=float_number)
button_clear_2 = Button(root,text="←",padx=49,pady=20,command=button_clear_one_char)
button_root = Button(root,text="√",padx=49,pady=20,command=button_root_number)

# 按钮布局
button_cl.grid(row=1,column=0)
button_eq.grid(row=1,column=1)
button_clear_2.grid(row=1,column=2)
button_addi.grid(row=1,column=3)

button_7.grid(row=2,column=0)
button_8.grid(row=2,column=1)
button_9.grid(row=2,column=2)
button_substr.grid(row=2,column=3)

button_4.grid(row=3,column=0)
button_5.grid(row=3,column=1)
button_6.grid(row=3,column=2)
button_multiply.grid(row=3,column=3)

button_3.grid(row=4,column=0)
button_2.grid(row=4,column=1)
button_1.grid(row=4,column=2)
button_divi.grid(row=4,column=3)

button_0.grid(row=5,column=0)
button_point.grid(row=5,column=1)
button_root.grid(row=5,column=2)

root.mainloop()

额外优化说明

  • 修正除法按钮文本为标准的/(原代码使用%易混淆)
  • 添加除零错误提示,避免程序崩溃
  • 给退格按钮增加空输入判断,防止索引越界
  • 优化结果显示逻辑,整数结果自动去除末尾.0

内容的提问来源于stack exchange,提问作者Joelinton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 08:48:21