Python Tkinter计算器GUI运行报错:_tkinter.tkapp无displayframe属性
错误原因
- 核心问题是属性初始化顺序错误:你在
__init__方法中先执行了self.create_display_labels()、self.create_digits_buttons(),但这两个方法内部用到的self.display_frame、self.buttons_frame属性,是在这两个方法调用完成后才创建的,调用时属性还未定义,因此抛出属性不存在的错误。
修复方法
调整__init__方法内的代码执行顺序,先创建两个框架容器,再基于容器创建标签和按钮即可,修正后的完整代码如下:
from tkinter import * SMALL_FONT_STYLE = "Arial 16" LIGHT_GRAY = "#F5F5F5" LABEL_COLOR = "#25265E" LARGE_FONT_STYLE = "Arial 40 bold" WHITE = "#FFFFFF" class Calculator(Tk): def __init__(self): super().__init__() self.geometry("375x677") self.resizable(0,0) self.title("Calculator") self.total_expression = "0" self.current_expression = "0" # 先创建框架容器,再创建依赖框架的组件 self.display_frame = self.create_display_frame() self.buttons_frame = self.create_buttons_frame() self.total_label, self.label = self.create_display_labels() self.digits = {7:(1,1), 8:(1,2), 9:(1,3), 4:(2,1), 5:(2,2), 6:(2,3), 1:(3,1),2:(3,2), 3:(3,3), 0:(4,2), '.':(4,1)} self.create_digits_buttons() def create_display_labels(self): total_label = Label(self.display_frame, text=self.total_expression, anchor=E, bg=LIGHT_GRAY, fg=LABEL_COLOR, padx=24, font=SMALL_FONT_STYLE) total_label.pack(expand=True, fill="both") label = Label(self.display_frame, text=self.current_expression, anchor=E, bg=LIGHT_GRAY, fg=LABEL_COLOR, padx=24, font=LARGE_FONT_STYLE) label.pack(expand=True, fill="both") return total_label, label def create_display_frame(self): frame = Frame(self, height=221, bg=LIGHT_GRAY) frame.pack(expand=True, fill="both") return frame def create_buttons_frame(self): frame = Frame(self) frame.pack(expand=TRUE, fill="both") return frame def create_digits_buttons(self): for digit, grid_value in self.digits.items(): button = Button(self.buttons_frame, text= str(digit), bg=WHITE, fg=LABEL_COLOR) button.grid(row = grid_value[0], column = grid_value[1], sticky=NSEW) if __name__ == '__main__': Calc = Calculator() Calc.mainloop()
注:额外修正了标签默认显示的表达式错误,原来的两个标签都显示total_expression,改为下方大标签显示current_expression更符合计算器逻辑
内容的提问来源于stack exchange,提问作者ADI23
相关产品推荐
相关产品推荐

