在努力学习tkinter Frame
和LabelFrame
的子类以便他们坐在正确的父母身上时,我发现很多答案都表明super().__init__
比{{1}更好当子类化时。
所以我试了一下,看看大惊小怪的事情,它似乎根本不起作用。在python 2.7中,它抱怨了参数的类型。在3.4中,它表示master有多个定义。超级评论如下,它按预期工作。我做错了什么?
BaseClass.__init()__
在# import Tkinter as tki # py 2.7
import tkinter as tki # py 3.4
class App(tki.LabelFrame):
def __init__(self, parent):
tki.LabelFrame.__init__(self, master=parent, text='inner')
# super().__init__(self, master=parent, text='inner') #py 3.4
# super(App, self).__init__(self, master=parent, text='inner') #py 2.7
# super(App, self).__init__(master=parent, text='inner') #py 2.7
self.quit = tki.Button(self, text='quit', command=exit)
self.quit.grid()
if __name__ == '__main__':
root = tki.Tk()
root.title('nesting testing')
outer = tki.LabelFrame(root, text='outer level')
outer.pack()
app = App(outer)
app.pack()
root.mainloop()
的调用中删除self
是我尝试过的第一件事,但在py2.7中,我仍然收到相同的错误消息,无论是否在那里。
没有super().__init__()
:
self
使用Traceback (most recent call last):
File "C:\Python\TESTS\test_super.py", line 21, in <module>
app = App(outer)
File "C:\Python\TESTS\test_super.py", line 9, in __init__
super(App, self).__init__(master=parent, text='inner') #py 2.7
TypeError: must be type, not classobj
:
self
错误消息与我自我保持一致这一事实表明它不是问题,但它对BaseClass调用正常工作的事实令我困惑于其他参数可能出错的地方
答案 0 :(得分:2)
如果我记得没错,那么
super().__init__(self, master=parent, text='inner') #py 3.4
super(App, self).__init__(self, master=parent, text='inner') #py 2.7
应该是 -
super().__init__(master=parent, text='inner') #py 3.4
super(App, self).__init__(master=parent, text='inner') #py 2.7
因为您不应将self
作为参数传递给超级__init__
。
实际上,在使用实例方法时,不应将self
显式传递给任何方法,当解释器调用时会自动提供self
BTW,
tki.LabelFrame.__init__(self, master=parent, text='inner')
super().__init__(self, master=parent, text='inner') #py 3.4
super(App, self).__init__(self, master=parent, text='inner') #py 2.7
super(App, self).__init__(master=parent, text='inner') #py 2.7
所有这些电话都是多余的。你应该只使用其中一个。我更喜欢 -
super().__init__(master=parent, text='inner') #py 3.4
或
super(App, self).__init__(master=parent, text='inner') #py 2.7
但如果您更喜欢使用第一个 -
tki.LabelFrame.__init__(self, master=parent, text='inner')
确保删除自己并制作它 -
tki.LabelFrame.__init__(master=parent, text='inner')
答案 1 :(得分:1)
以这种方式使用super
时,您无法明确传递self
。只需执行super(App, self).__init__(master=parent, text='inner')
(或Python {3 {1}}。