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

Tkinter点击按钮打开计算器新窗口仅显示空白问题排查

问题修复说明

你遇到的问题由3个核心错误导致:

  • 变量覆盖错误:代码中先将newWindow赋值为Toplevel新窗口对象,紧接着又将输入框Entry赋值给了同一个newWindow变量,原始的新窗口对象直接丢失,后续所有计算器控件都无法正确挂载到窗口上
  • 父容器配置错误:所有计算器按钮的父容器参数写了不存在的root变量,按钮实际没有被放到新窗口中
  • 拼写错误:button_subtract函数中将newWindow误写为newWindowe,运行时会触发命名异常
修复后完整代码
from tkinter import *
from tkinter.ttk import *
 
master = Tk()
master.geometry("200x200")
 
def openNewWindow():
    # 分开定义窗口对象和输入框对象,避免变量覆盖
    calc_window = Toplevel(master)
    calc_window.title("计算器")
    # 输入框单独命名为e
    e = Entry(calc_window, width=35, borderwidth=5)
    e.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
    
    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_add():
        first_number = e.get()
        global f_num
        global math
        math = "addition"
        f_num = int(first_number)
        e.delete(0, END)

    def button_equal():
        second_number = e.get()
        e.delete(0, END)
    
        if math == "addition":
            e.insert(0, f_num + int(second_number))
        if math == "subtraction":
            e.insert(0, f_num - int(second_number))
        if math == "multiplication":
            e.insert(0, f_num * int(second_number))
        if math == "devision":
            e.insert(0, f_num /  int(second_number))

    def button_subtract():
        # 修正拼写错误
        first_number = e.get()
        global f_num
        global math
        math = "subtraction"
        f_num = int(first_number)
        e.delete(0, END)

    def button_multiply():
        first_number = e.get()
        global f_num
        global math
        math = "multiplication"
        f_num = int(first_number)
        e.delete(0, END)

    def button_devide():
        first_number = e.get()
        global f_num
        global math
        math = "devision"
        f_num = int(first_number)
        e.delete(0, END)

    # 所有按钮父容器改为calc_window,不再用不存在的root
    button_1 = Button(calc_window, text="1", padx=40, pady=20, command=lambda: button_click(1))
    button_2 = Button(calc_window, text="2", padx=40, pady=20, command=lambda: button_click(2))
    button_3 = Button(calc_window, text="3", padx=40, pady=20, command=lambda: button_click(3))
    button_4 = Button(calc_window, text="4", padx=40, pady=20, command=lambda: button_click(4))
    button_5 = Button(calc_window, text="5", padx=40, pady=20, command=lambda: button_click(5))
    button_6 = Button(calc_window, text="6", padx=40, pady=20, command=lambda: button_click(6))
    button_7 = Button(calc_window, text="7", padx=40, pady=20, command=lambda: button_click(7))
    button_8 = Button(calc_window, text="8", padx=40, pady=20, command=lambda: button_click(8))
    button_9 = Button(calc_window, text="9", padx=40, pady=20, command=lambda: button_click(9))
    button_0 = Button(calc_window, text="0", padx=40, pady=20, command=lambda: button_click(0))
    button_add = Button(calc_window, text="+", padx=39, pady=20, command=button_add)
    button_equal = Button(calc_window, text="=", padx=91, pady=20, command=button_equal)
    button_clear = Button(calc_window, text="C", padx=91, pady=20, command=button_clear)
    button_subtract = Button(calc_window, text="-", padx=41, pady=20, command=button_subtract)
    button_multiply = Button(calc_window, text="*", padx=40, pady=20, command=button_multiply)
    button_devide = Button(calc_window, text="/", padx=41, pady=20, command=button_devide)

    button_1.grid(row=3, column=0)
    button_2.grid(row=3, column=1)
    button_3.grid(row=3, column=2)
    button_4.grid(row=2, column=0)
    button_5.grid(row=2, column=1)
    button_6.grid(row=2, column=2)
    button_7.grid(row=1, column=0)
    button_8.grid(row=1, column=1)
    button_9.grid(row=1, column=2)
    button_0.grid(row=4, column=0)
    button_clear.grid(row=4, column=1, columnspan=2)
    button_add.grid(row=5, column=0)
    button_equal.grid(row=5, column=1, columnspan=2)
    button_subtract.grid(row=6, column=0)
    button_multiply.grid(row=6, column=1)
    button_devide.grid(row=6, column=2)
 
label = Label(master, text="主窗口")
label.pack(pady = 10)
btn = Button(master, text="打开计算器", command = openNewWindow)
btn.pack(pady = 10)
 
mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:15:04