我知道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 ++部分,不再允许属性访问。 脚本终止。
答案 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类和用户定义的类。否则,您可能会遇到问题。