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
相关产品推荐
相关产品推荐

