寻找超级解释 /tkinter方向(获得最大递归深度而无需超级)



,所以我试图使用我的"控制器"来调用我的"视图"。但是,如果我不使用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的监督。

  1. 该进口似乎照顾了实例化

部分与我在课程结束时使用的不一致有关,即;

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)

最新更新