2014-02-07 65 views
0

请帮忙修复脚本。如何实现多重继承?

import tkinter 
import sys 


class mainMenu(tkinter.Frame): 

    def __init__(self, parent): 
     tkinter.Frame.__init__(self, parent) 
     self.pack(side = 'top', fill = 'x') 
     self.parent = parent 
     self.make_menu_bar() 

    def make_menu_bar(self): 
     menubar = tkinter.Menu(self.parent) 
     self.parent.config(menu = menubar)       

     file = tkinter.Menu(menubar, tearoff = False) 
     file.add_command(label = 'Quit', command = sys.exit()) 
     menubar.add_cascade(label = 'File', menu = file) 


class MainFrame(tkinter.Frame, mainMenu): 

    def __init__(self, parent): 
     tkinter.Frame.__init__(self, parent) 
     self.pack(side = 'top', fill = 'x', expand = 'yes') 
     self.parent = parent 
     self.make_elements() 

    def make_elements(): 
     self.menu = TextPadMenu.__init__(self, parent) 


root = MainFrame(tkinter.Tk()) 
root.mainloop() 

问题是,类MainFrame不能继承:tkinter.Frame,mainMenu。错误消息是:

Traceback (most recent call last): File "C:\Python33\projects\TEXTPADS\textPad_OOP\q.py", line 22, in class MainFrame(tkinter.Frame, mainMenu): TypeError: Cannot create a consistent method resolution order (MRO) for bases Frame, mainMenu

+5

为什么你要'MainFrame'从框架和MAINMENU继承? mainMenu已经从Frame继承,所以不需要再从Frame继承。 – BrenBarn

+0

这个简单的案例研究,它没有实用价值。重要的是我理解原理 – Sergey

+2

原则是,不要让一个类多次继承同一个类。如果B类从A继承,那么不要创建一个从A和B明确继承的类C.只要使它从B继承,并且这也会自动使它继承A.回答#1 – BrenBarn

回答

1

这不是一个tkinter问题,这只是如何在python中工作。你的问题的简短答案是,你不能做你想做的事。有可能破解一个解决方法,但为什么?你不应该永远继承一个类,也不能继承该类的基类。

为了说明这不是一个Tkinter的程序,这里有一个最小的解决方案,让同样的错误事实:

class Base(object): pass 
class Example1(Base): pass 
class Example2(Base, Example1): pass 

运行时,这会产生以下输出:

bash-3.2$ python example.py 
Traceback (most recent call last): 
    File "example.py", line 3, in <module> 
    class Example2(Base, Example1): pass 
TypeError: Error when calling the metaclass bases 
    Cannot create a consistent method resolution 
order (MRO) for bases Example1, Base 

了解方法当您超出正常使用的范围时,分辨率顺序可能会很困难。如果你想更深入的回答这个问题:“为什么我不能这样做呢?”,从这里开始:

http://www.python.org/download/releases/2.3/mro/