wxPython和多重继承

时间:2011-10-06 18:00:03

标签: inheritance wxpython

我知道Python与Java不同,它支持继承。但是用户类是否可以从几个wxPython类继承而没有任何问题? (wxPython设计是否允许这样做?)

提前谢谢

我使用wxPython 2.8绑定在Xubuntu 11.04下进行编码

P.S:这是我的尝试。

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

import wx

class Square(wx.Panel, wx.Control):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent, wx.ID_ANY, size=(60,60), pos=(80,50))
        wx.Control.__init__(self, parent)
        self.SetBackgroundColour(wx.Colour(0,0,255))

class MainFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Reactive square application",
            size = (300,200))
        panel = wx.Panel(self, wx.ID_ANY)
        square1 = Square(panel)
        square2 = Square(panel)
        square1.Bind(wx.EVT_BUTTON, self.OnSquareClick)

    def OnSquareClick(self, event):
        dialog = wx.MessageDialog(self, "You clicked on square !!!",
            "Hit has been done", wx.OK)
        dialog.Show(True)


if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MainFrame()
    frame.Show(True)
    app.MainLoop()

这是堆栈跟踪:

  

swig / python检测到'wxControl *'类型的内存泄漏,没有找到析构函数。   Traceback(最近一次调用最后一次):       文件“/home/laurent/Documents/Programmation/Projets/Python/SourcesDeTest/ReactiveSquare.py”,第31行,in       frame = MainFrame()       在 init 中输入文件“/home/laurent/Documents/Programmation/Projets/Python/SourcesDeTest/ReactiveSquare.py”,第19行       square1 = Square(面板)       在 init 中输入文件“/home/laurent/Documents/Programmation/Projets/Python/SourcesDeTest/ReactiveSquare.py”,第10行   wx.Control。 init (self,parent)   在 init 中输入文件“/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py”,第11718行   self._setOORInfo(个体经营)       在_setOORInfo中输入文件“/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py”,第3887行       ARGS [0] .this.own(假)       文件“/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py”,第14606行, getattr       引发PyDeadObjectError(self.attrStr%self._name)       wx._core.PyDeadObjectError:已删除Square对象的C ++部分,不再允许属性访问。       脚本终止。

3 个答案:

答案 0 :(得分:1)

绝对可以继承多个父类,是的。

http://docs.python.org/tutorial/classes.html#multiple-inheritance

我似乎没有遇到任何使用多个基类的麻烦,包括wx类:

class VirtualList(ListCtrl):
  def __init__(self,
               parent,
               colref = None,
               style = LC_REPORT | LC_VIRTUAL | LC_HRULES | LC_VRULES):

    ListCtrl.__init__(self, parent, style = style)

class TransformList(VirtualList, CheckListCtrlMixin):
  def __init__(self, parent, refid):
    VirtualList.__init__(self, parent, colref = 'transform_columns')

    CheckListCtrlMixin.__init__(self)

    # This facilitates drag / drop re-ordering.
    self.Bind(wx.EVT_LIST_BEGIN_DRAG, self._startDrag)

    dt = ListDrop(self._reorder)

    self.SetDropTarget(dt)

答案 1 :(得分:1)

根据我的经验,wxPython不鼓励wxPython类的多重继承。

执行此类操作会导致新课程出错或意外后果:

class MyControl(wxButton, wxComboBox):
    pass

但是,您可以使用多个继承来继承wxPython类和您自己的类,以便以更多OO方式扩展它。

 class ControlActions(object):
     def MoveHere(self):
          pass

 class MyControl(wxButton, DoActions):
     pass

答案 2 :(得分:1)

你真的不想用wxPython类进行多重继承,除非它们是普通的wx类加上mixin(参见g.d.d.c的答案)。或者是wxPython类和用户定义的类。否则,您可能会遇到问题。