,所以我试图使用我的"控制器"来调用我的"视图"。但是,如果我不使用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()
编辑:评论时这些尝试方法无效,但基本代码是:
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) - 在这种情况下,控制器将实例化确定要构建的构建处理程序。
找到了我的问题。一些python的监督。
- 该进口似乎照顾了实例化
部分与我在课程结束时使用的不一致有关,即;
a。#if 名称 ==" main ":ControlHandler()忘了被评论
b。buildtk
root = tt.Tk()
all = buildTK(root)
root.mainloop()
c。buildtk0
def main():
root = tk.Tk()
app = Application(root)
app.mainloop()
if __name__ == "__main__":main()
else: main()
非常感谢反馈家伙!给了我很多考虑/评论!
您在此处显示的不是继承的好示例 - 它是某种搞砸了。YouT Adtempet的超级用途也是如此 - 它不会崩溃,因为您在创建它之后根本没有使用Super -Object进行任何操作。
so。,首先,定义如果您继承了Composing的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年代的纯粹主义者认为这是一个好主意,并以这种方式进行了记录。TKINTER类有数百种方法和属性 - 如果您尝试将其中之一属于其中一个,即您的名称闪烁的天空架的机会,请先。
。否则,如果您只是尝试从任何> tkinter组件中继承,只是使用它们,并在不使用SUPE上放弃,您的应用程序很有可能工作 -
至于"超级"的作用:它提供了一种干净的含义方法。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)