寻找一个超级解释/ tkinter方向(获得没有超级的最大递归深度)

时间:2016-06-21 18:00:07

标签: python 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()

编辑:当注释掉时,那些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) - 在这种情况下,控制器将实例化构建处理程序,这将决定构建什么。

2 个答案:

答案 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疏忽。

  1. 导入似乎负责实例化
  2. 部分原因与我在课程结束时使用的不一致有关,即

    一个。 #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() 
    

    超级欣赏反馈家伙!给了我很多考虑/评论!