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

Python GUI计算器乘法与除法功能异常求助

Tkinter计算器乘除功能修复方案

问题描述

我正在开发一款基于tkinter的Python GUI计算器,多次尝试后发现乘法与除法功能无法正常运行。我反复查看教程十余次,甚至咨询了朋友,但仍未找到问题所在,恳请各位提供技术帮助。

用户提供的原始代码

from tkinter import *

root = Tk()
root.title("Calculator")

box = Entry(root, width=40, borderwidth=6)
box.grid(row=0, column=0, columnspan=3, padx=15, pady=15)


def buttonClick(number):
  current = box.get()
  box.delete(0, END)
  box.insert(0, current + str(number))


def buttonClear():
  box.delete(0, END)


def buttonAdd():
  firstNumber = box.get()
  global numOne
  global math
  math = "addition"
  numOne = int(firstNumber)
  box.delete(0, END)


def buttonEqual():
  secondNumber = box.get()
  box.delete(0, END)

  if math == "addition":
    box.insert(0, numOne + int(secondNumber))

    if math == "subtraction":
      box.insert(0, numOne - int(secondNumber))

    if math == "multiplication":
      box.insert(0, numOne * int(secondNumber))

  if math == "division":
    box.insert(0, numOne / int(secondNumber))


def buttonSubtract():
  firstNumber = box.get()
  global numOne
  global math
  math = "subtraction"
  numOne = int(firstNumber)
  box.delete(0, END)


def buttonMultiply():
  firstNumber = box.get()
  global numOne
  global math
  math = "multiplication"
  numOne = int(firstNumber)
  box.delete(0, END)


def buttonDivide():
  firstNumber = box.get()
  global numOne
  global math
  math = "division"
  numOne = int(firstNumber)
  box.delete(0, END)


Button1 = Button(root,
                 text="1",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(1))
Button2 = Button(root,
                 text="2",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(2))
Button3 = Button(root,
                 text="3",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(3))
Button4 = Button(root,
                 text="4",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(4))
Button5 = Button(root,
                 text="5",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(5))
Button6 = Button(root,
                 text="6",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(6))
Button7 = Button(root,
                 text="7",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(7))
Button8 = Button(root,
                 text="8",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(8))
Button9 = Button(root,
                 text="9",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(9))
Button0 = Button(root,
                 text="0",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(0))

ButtonAdd = Button(root, text="+", padx=45, pady=22, command=buttonAdd)
ButtonEqual = Button(root, text="=", padx=45, pady=22, command=buttonEqual)
ButtonClear = Button(root,
                     text="Clear",
                     padx=37,
                     pady=22,
                     command=lambda: buttonClear())

ButtonSubtract = Button(root,
                        text="-",
                        padx=45,
                        pady=22,
                        command=buttonSubtract)
ButtonMultiply = Button(root,
                        text="*",
                        padx=45,
                        pady=22,
                        command=buttonMultiply)
ButtonDivide = Button(root, text="/", padx=45, pady=22, command=buttonDivide)

Button1.grid(row=3, column=0)
Button2.grid(row=3, column=1)
Button3.grid(row=3, column=2)

Button4.grid(row=2, column=0)
Button5.grid(row=2, column=1)
Button6.grid(row=2, column=2)

Button7.grid(row=1, column=0)
Button8.grid(row=1, column=1)
Button9.grid(row=1, column=2)

Button0.grid(row=4, column=1)

ButtonAdd.grid(row=1, column=4)
ButtonEqual.grid(row=4, column=2)
ButtonClear.grid(row=4, column=0)

ButtonSubtract.grid(row=2, column=4)
ButtonMultiply.grid(row=4, column=4)
ButtonDivide.grid(row=3, column=4)

root.mainloop()

问题分析

核心错误出在buttonEqual()函数的缩进逻辑上:

  • 减法和乘法的判断语句被错误嵌套在加法的if代码块内部,导致只有当math == "addition"时才会检查这两个条件,完全无法触发乘除逻辑。
  • 除法的判断虽然独立,但整个条件分支结构用多个独立if会造成冗余判断,逻辑不够严谨。

修复方案

修正buttonEqual()函数的缩进和条件结构,改为如下:

def buttonEqual():
  secondNumber = box.get()
  box.delete(0, END)

  if math == "addition":
    box.insert(0, numOne + int(secondNumber))
  elif math == "subtraction":
    box.insert(0, numOne - int(secondNumber))
  elif math == "multiplication":
    box.insert(0, numOne * int(secondNumber))
  elif math == "division":
    # 增加除零判断,避免运行时错误
    if int(secondNumber) == 0:
      box.insert(0, "Error")
    else:
      box.insert(0, numOne / int(secondNumber))

额外优化

  • 增加除零错误判断,避免用户输入0作为除数导致程序崩溃。
  • 使用elif替代多个独立if,提升代码执行效率,逻辑更清晰。

完整修复后代码

from tkinter import *

root = Tk()
root.title("Calculator")

box = Entry(root, width=40, borderwidth=6)
box.grid(row=0, column=0, columnspan=3, padx=15, pady=15)


def buttonClick(number):
  current = box.get()
  box.delete(0, END)
  box.insert(0, current + str(number))


def buttonClear():
  box.delete(0, END)


def buttonAdd():
  firstNumber = box.get()
  global numOne
  global math
  math = "addition"
  numOne = int(firstNumber)
  box.delete(0, END)


def buttonEqual():
  secondNumber = box.get()
  box.delete(0, END)

  if math == "addition":
    box.insert(0, numOne + int(secondNumber))
  elif math == "subtraction":
    box.insert(0, numOne - int(secondNumber))
  elif math == "multiplication":
    box.insert(0, numOne * int(secondNumber))
  elif math == "division":
    if int(secondNumber) == 0:
      box.insert(0, "Error")
    else:
      box.insert(0, numOne / int(secondNumber))


def buttonSubtract():
  firstNumber = box.get()
  global numOne
  global math
  math = "subtraction"
  numOne = int(firstNumber)
  box.delete(0, END)


def buttonMultiply():
  firstNumber = box.get()
  global numOne
  global math
  math = "multiplication"
  numOne = int(firstNumber)
  box.delete(0, END)


def buttonDivide():
  firstNumber = box.get()
  global numOne
  global math
  math = "division"
  numOne = int(firstNumber)
  box.delete(0, END)


Button1 = Button(root,
                 text="1",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(1))
Button2 = Button(root,
                 text="2",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(2))
Button3 = Button(root,
                 text="3",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(3))
Button4 = Button(root,
                 text="4",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(4))
Button5 = Button(root,
                 text="5",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(5))
Button6 = Button(root,
                 text="6",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(6))
Button7 = Button(root,
                 text="7",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(7))
Button8 = Button(root,
                 text="8",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(8))
Button9 = Button(root,
                 text="9",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(9))
Button0 = Button(root,
                 text="0",
                 padx=37,
                 pady=22,
                 command=lambda: buttonClick(0))

ButtonAdd = Button(root, text="+", padx=45, pady=22, command=buttonAdd)
ButtonEqual = Button(root, text="=", padx=45, pady=22, command=buttonEqual)
ButtonClear = Button(root,
                     text="Clear",
                     padx=37,
                     pady=22,
                     command=lambda: buttonClear())

ButtonSubtract = Button(root,
                        text="-",
                        padx=45,
                        pady=22,
                        command=buttonSubtract)
ButtonMultiply = Button(root,
                        text="*",
                        padx=45,
                        pady=22,
                        command=buttonMultiply)
ButtonDivide = Button(root, text="/", padx=45, pady=22, command=buttonDivide)

Button1.grid(row=3, column=0)
Button2.grid(row=3, column=1)
Button3.grid(row=3, column=2)

Button4.grid(row=2, column=0)
Button5.grid(row=2, column=1)
Button6.grid(row=2, column=2)

Button7.grid(row=1, column=0)
Button8.grid(row=1, column=1)
Button9.grid(row=1, column=2)

Button0.grid(row=4, column=1)

ButtonAdd.grid(row=1, column=4)
ButtonEqual.grid(row=4, column=2)
ButtonClear.grid(row=4, column=0)

ButtonSubtract.grid(row=2, column=4)
ButtonMultiply.grid(row=4, column=4)
ButtonDivide.grid(row=3, column=4)

root.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:35:20