属性错误:'NoneType'对象没有属性'_root'。

6

我完全是Python 3的新手,只是在跟随来自YouTube的简单练习。

https://www.youtube.com/watch?v=nefopNkZmB4&index=3&list=PL6gx4Cwl9DGAcbMi1sH6oAMk4JHw91mC_

这是我的代码:

    from tkinter import *


def iCalc(source, side):
    storeObj = Frame(source, borderwidth=4, bd=4, bg="powder blue")
    storeObj.pack(side=side, expand=YES, fill=BOTH)
    return storeObj


def button(source, side, text, command=None):
    storeObj = Button(source, text=text, command=command)
    storeObj.pack(side=side, expand=YES, fill=BOTH)
    return storeObj


class app(Frame):

    def __init__(self):
        Frame.__init__(self)
        self.option_add('*Font', 'arial 20 bold')
        self.pack(expand=YES, fill=BOTH)
        self.master.title('Calculator')

    display = StringVar()
    Entry(self, relief=RIDGE, textvariable=display, justify='right', bd=30, bg="powder blue").pack(side=TOP, expand=YES,
                                                                                                   fill=BOTH)
for clearBut in (["CE"], ["C"]):
    erase = iCalc(self, TOP)
for ichar in clearBut:
    button(erase, LEFT, ichar,
           lambda storeObj=display, q=ichar: storeObj.set(''))

for NumBut in ("789/", "456*", "123-", "0.+"):
    FunctionNum = iCalc(self, TOP)
for iEquals in NumBut:
    button(FunctionNum, LEFT, iEquals,
           lambda storeObj=display, q=iEquals: storeObj.set(storeObj.get() + q))
EqualsButton = iCalc(self, TOP)
for iEquals in '=':
    if iEquals in "=":
        btniEquals = button(EqualsButton, LEFT, iEquals)
        btniEquals.bind('<ButtonRelease-1>',
                        lambda e, s=self, storeObj=display: s.calc(storeObj), '+')
else:
    btniEquals = button(EqualsButton, LEFT, iEquals,
                        lambda storeObj=display, s=' %s ' % iEquals: storeObj.set(storeObj.get() + s))


def calc(self, display):
    try:
        display.set(eval(display.get()))
    except:
        display.set("ERROR")

if __name__ == '__main__':
    app().mainloop()

我遇到了错误: enter image description here 我做错了什么?

1
在退出主循环后,您将无法创建任何其他小部件。请删除程序的最后两个语句。 - DYZ
抱歉,您指的是哪两个语句? #Entry(self,relief = RIDGE, #textvariable = display,justify = 'right', bd = 30, bg = "powder blue").pack(side = TOP, expand = YES, fill = BOTH) - Serdia
display=...Entry(self,... - DYZ
#DYZ 我已经删除了那些行,但错误仍然存在。我也更新了我的完整代码。谢谢。 - Serdia
请修复您的代码格式。更改后,现在您的代码正在做什么一点都不清楚。 - DYZ
我想我修好了。很抱歉。 - Serdia
1个回答

21
由于缩进的原因,display = StringVar() 不在一个方法中。这意味着它会在类首次定义时执行。在创建根窗口后才能创建 StringVar 实例。
你需要再添加一层缩进来调整该行以及下面的行。

我从事SQL编程,无论你如何编写代码都不会影响其功能,除非你想让它看起来更美观。那么在Python中,我是否需要测量行之间的距离?或者我应该怎么称呼它? - Serdia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接