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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:57:07