所以我试图用我的“控制器”来调用我的“视图”。但是如果我不使用super,当buildTK尝试构建iiBar时,我会得到无限递归。使用超级一切都很好。我只想理解为什么会这样。
import inputhandler as iH
import buildtk as tA
import scanhandler as aS
class ControlHandler:
def __init__(self):
#self.view = tA.buildTK() #does not work
self.view = super(tA.buildTK) #works
self.smodel = aS.aScan()
self.imodel = iH.InputHandler()
buildTK类:
import tkinter as tt
import controlhandler as cH
class buildTK(tt.Frame):
def __init__(self, master = None):
self.frame = tt.Frame(master, bg="tan")
self.frame.grid()
self.ibar = iiBar(self.frame)
...
class iiBar:
def __init__(self, master):
print(repr(self)) #prints forever
self.mbar = tt.Frame(master, relief = 'raised', bg="blue")
self.mbar.grid(column=0, row=0) #Show File Bar
self.tryFile()
self.tryTool()
self.tryH()
编辑:当注释掉时,那些try方法没有效果,但基本代码是:
def tryTool(self):
# Create tools menu
self.toolsbutton = tt.Menubutton(self.mbar, text = 'Tools', )
self.toolsbutton.grid(row=0, column=2)
self.toolsmenu = tt.Menu(self.toolsbutton, tearoff=0)
self.toolsbutton['menu'] = self.toolsmenu
# Populate tools menu
self.toolsmenu.add('command', label = 'tools', command = root.destroy)
出于好奇,是否有最好的做法来实现我想要做的事情?最终我想要一个“构建处理程序”来实例化表单(tkinter,html,xml) - 在这种情况下,控制器将实例化构建处理程序,这将决定构建什么。
答案 0 :(得分:0)
你在这里展示的不是一个很好的继承的例子 - 它是一些混乱的东西。同样的事情适用于你使用super - 它只是不会崩溃,因为在创建它之后你根本没有对超级对象做任何事情。
首先,定义是否继承合成的Tkinter组件,具有引用Tkinter对象的类的属性。此代码段:
class buildTK(tt.Frame):
def __init__(self, master = None):
self.frame = tt.Frame(master, bg="tan")
self.frame.grid()
self.ibar = iiBar(self.frame)
两者兼而有之。 我认为(以及许多互联网)试图从复杂的GUI类继承是浪费时间和精力 - 虽然90年代的OO纯粹主义者认为这是一个好主意并以这种方式记录。 Tkinter类有数百种方法和属性 - 如果你试图将其中一个方法和属性子类化,那么你开始使用名称冲击天空火箭的可能性。
否则,如果您只是尝试继承任何 tkinter组件,只是使用它们,并放弃不使用supe,那么您的应用就会很好工作的机会 -
至于" super"确实:它提供了一个干净的方法来调用你在其超类中的子类中重写的方法,尊重Python的方法 - 解析 - 顺序(mro),并且不需要对方法内的超类引用进行硬编码。 super
仅应用于此 - 例如,如果您要正确继承tkinter.frame:
class buildTK(tt.Frame):
def __init__(self, master = None):
super(buildTK, self).__init__(master, bg="tan")
# this is for composition: self.frame = tt.Frame(master, bg="tan")
self.grid()
# a prefix on our attributes and methods avoid clashing with
# tkinter:
self._myapp_ibar = iiBar(self.frame)
答案 1 :(得分:0)
找到我的问题。一些python疏忽。
部分原因与我在课程结束时使用的不一致有关,即
一个。 #if 名称 ==" main ":ControlHandler() 忘记了被评论出来的
湾buildTK
root = tt.Tk()
all = buildTK(root)
root.mainloop()
℃。 buildTK0
def main():
root = tk.Tk()
app = Application(root)
app.mainloop()
if __name__ == "__main__":main()
else: main()
超级欣赏反馈家伙!给了我很多考虑/评论!