Python 错误解释-';statister&x27;对象没有属性';tk';

Python 错误解释-';statister&x27;对象没有属性';tk';,python,class,python-3.x,tkinter,tk,Python,Class,Python 3.x,Tkinter,Tk,我正在尝试用Python创建一个简单的计时器,目标是使用类构建用户界面。我想使用这些类初始化用户界面。然后在正文的正文中,我想使用.grid和.configure方法添加属性。但当我尝试这样做时,会出现错误:“statister”对象没有属性“tk” 我是一个编程初学者,但是如果我正确理解了错误,它会导致错误,因为.grid和其他按钮方法不是由我的statister(即静态接口)类继承的。这是正确的吗?如何解决此错误?我确实继承了Button类甚至Tk类的属性,但在后面的例子中,我得到了一个无限

我正在尝试用Python创建一个简单的计时器,目标是使用类构建用户界面。我想使用这些类初始化用户界面。然后在正文的正文中,我想使用.grid和.configure方法添加属性。但当我尝试这样做时,会出现错误:“statister”对象没有属性“tk”

我是一个编程初学者,但是如果我正确理解了错误,它会导致错误,因为.grid和其他按钮方法不是由我的statister(即静态接口)类继承的。这是正确的吗?如何解决此错误?我确实继承了Button类甚至Tk类的属性,但在后面的例子中,我得到了一个无限循环,即超过了最大递归深度

谢谢你的帮助

#This is a simple timer version

from tkinter import *

window = Tk()
window.title('Tea timer')
window.minsize(300,100)
window.resizable(0,0)

class statInter(Button,Entry):

    def __init__(self, posx, posy):
        self.posx = posx  # So the variables inside the class are defined broadly
        self.posy = posy

    def button(self):
        Button(window).grid(row=self.posx, column=self.posy)

    def field(self):
        Entry(window, width=5)

sth = statInter(1,2)
sth.grid(row=1, column = 2)

window.mainloop()

出现此错误的原因是,您从未从继承的类调用任何构造函数(无论是
按钮还是
条目

如果您将
\uuuuu init\uuuuu
更改为:

def __init__(self, posx, posy):
    Button.__init__(self)
    self.posx = posx  # So the variables inside the class are defined broadly
    self.posy = posy
然后,您将不会得到以前的错误,并弹出一个小窗口。在新的
\uuuu init\uuuu
中,我们显式调用
按钮的构造函数

与Java和其他一些语言不同,默认情况下不会调用
super
构造函数。我假设从其他
tkinter
类继承的每个类都必须有一个
tk
字段。通过调用您选择的父构造函数,将创建此字段。但是,如果您不调用父构造函数,那么这将不是一个已建立的字段,您将得到所描述的错误('statister'对象没有属性'tk')


问题在于派生的
statister
类(中建议的类名)没有初始化其基类,这在Python中通常不会隐式发生(例如,C++)

为了在
statister.\uuu init\uuuu()
方法中实现这一点,您需要知道将包含它的
父级
小部件(除顶层窗口外的所有小部件都包含在层次结构中)-因此需要将一个额外的参数传递给派生类的构造函数,以便将其传递给每个基类构造函数

您还没有遇到其他问题,但可能很快就会遇到。为了避免这种情况,在
button()
field()
中显式调用基类方法时,还需要显式传递
self


这是一个很好的答案,尽管我怀疑OP想要继承
按钮和
条目,或者使用合成来创建
按钮和
条目,但不能两者兼而有之。@Bryan:谢谢。当然,关于存在“是一个”与“有一个”的问题,你是对的。我试图回答得足够好,以解决眼前的问题,这样OP就可以继续他们的开发——同时指出在Python中执行多重继承时可能存在的一些潜在陷阱,我认为这可能就是他们试图实现的目标。
from tkinter import *

window = Tk()
window.title('Tea timer')
window.minsize(300,100)
window.resizable(0,0)

class StatInter(Button, Entry):

    def __init__(self, parent, posx, posy):  # Added parent argument
        Button.__init__(self, parent)  # Explicit call to base class
        Entry.__init__(self, parent)  # Explicit call to base class
        self.posx = posx  # So the variables inside the class are defined broadly
        self.posy = posy

    def button(self):
        Button.grid(self, row=self.posx, column=self.posy)  # Add self

    def field(self):
        Entry.config(self, width=5)  # Add self

sth = StatInter(window, 1, 2)  # Add parent argument to call
sth.grid(row=1, column=2)

window.mainloop()