【问题标题】:wxPython and multiple inheritancewxPython 和多重继承
【发布时间】:2011-12-02 11:19:33
【问题描述】:

我知道 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 *”类型的内存泄漏,没有找到析构函数。 回溯(最近一次通话最后): 文件“/home/laurent/Documents/Programmation/Projets/Python/SourcesDeTest/ReactiveSquare.py”,第 31 行,在 框架 = MainFrame() init 中的文件“/home/laurent/Documents/Programmation/Projets/Python/SourcesDeTest/ReactiveSquare.py”,第 19 行 square1 = 正方形(面板) init 中的文件“/home/laurent/Documents/Programmation/Projets/Python/SourcesDeTest/ReactiveSquare.py”,第 10 行 wx.Control.init(自身,父级) init 中的文件“/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py”,第 11718 行 self._setOORInfo(self) _setOORInfo 中的文件“/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py”,第 3887 行 args[0].this.own(False) getattr 中的文件“/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py”,第 14606 行 引发 PyDeadObjectError(self.attrStr % self._name) wx._core.PyDeadObjectError: Square 对象的 C++ 部分已被删除,不再允许属性访问。 脚本终止。

【问题讨论】:

    标签: inheritance wxpython


    【解决方案1】:

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

    【讨论】:

    • 好吧,我不知道 mixin 类。我要在谷歌上搜索一个好的介绍。因为我认为第二种解决方案(wxPython sub +我自己的类)也将很难使其工作
    【解决方案2】:

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

    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)
    

    【讨论】:

    • 是的,我确实知道,正如我在第一篇文章中所说的那样。但似乎我在尝试使用 wxPython 类应用继承时遇到了问题
    • @LaurentBERNABE - 如果您演示的代码似乎不适用于多重继承,我们将为您提供更多帮助。
    【解决方案3】:

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

    这样做会导致新类出现错误或意外后果:

    class MyControl(wxButton, wxComboBox):
        pass
    

    但是,您可以使用多重继承来继承 wxPython 类和您自己的类,以便以更 OO 的方式对其进行扩展。

     class ControlActions(object):
         def MoveHere(self):
              pass
    
     class MyControl(wxButton, DoActions):
         pass
    

    【讨论】:

    • 嗯,这不能解决我的问题。不过谢谢。事实上,我想同时继承 wxPanel 和 wxControl => 这样我希望绘制多个对 wxEVT_BUTTON 事件作出反应的蓝色方块。但我遇到了一个严重的例外。我也尝试使用 PlateButton,但我没有设法给它我想要的简单盒子外观。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2021-06-25
    • 2014-10-04
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多