wxPython и множественное наследование - PullRequest
0 голосов
/ 06 октября 2011

Я знаю, что Python, в отличие от Java, поддерживает наследование. Но может ли пользовательский класс наследовать от нескольких классов wxPython без каких-либо проблем? (Разрешает ли это дизайн wxPython?)

Заранее спасибо

Я пишу под Xubuntu 11.04 с привязкой wxPython 2.8

П.С .: Это моя попытка.

#!/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, в frame = MainFrame () Файл "/home/laurent/Documents/Programmation/Projets/Python/SourcesDeTest/ReactiveSquare.py", строка 19, в init квадрат1 = квадрат (панель) Файл "/home/laurent/Documents/Programmation/Projets/Python/SourcesDeTest/ReactiveSquare.py", строка 10, в init wx.Control. init (self, parent) Файл "/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py", строка 11718, в init self._setOORInfo (Я) Файл "/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py", строка 3887, в _setOORInfo арг [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: Часть C ++ объекта Square была удалена, доступ к атрибутам больше не разрешен. Сценарий прекращен.

Ответы [ 3 ]

1 голос
/ 06 октября 2011

По моему опыту, wxPython не поддерживает множественное наследование классов wxPython.

Выполнение чего-либо подобного может привести к ошибкам или неожиданным последствиям для вашего нового класса:

class MyControl(wxButton, wxComboBox):
    pass

Однако вы можете использовать множественное наследование для наследования класса wxPython и вашего собственного класса, чтобы расширить его более особым образом.

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

 class MyControl(wxButton, DoActions):
     pass
1 голос
/ 06 октября 2011

Вы на самом деле не хотите делать множественное наследование с классами wxPython, ЕСЛИ они не являются обычным классом wx плюс миксин (см. Ответ g.d.d.c). Или класс wxPython и пользовательский класс. В противном случае у вас могут возникнуть проблемы.

1 голос
/ 06 октября 2011

Наследование от нескольких родительских классов определенно возможно, да.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...