如何实现多重继承?

时间:2014-02-07 09:01:15

标签: python python-3.x tkinter

请帮助修复脚本。

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(最近一次调用最后一次):文件   “C:\ Python33 \ projects \ TEXTPADS \ textPad_OOP \ q.py”,第22行,in       class MainFrame(tkinter.Frame,mainMenu):TypeError:无法为基础创建一致的方法解析顺序(MRO)Frame,mainMenu

1 个答案:

答案 0 :(得分: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/