Могу ли я использовать wxPython wx.ItemContainer в производном классе? - PullRequest
0 голосов
/ 25 февраля 2010

Я пытаюсь создать новый элемент управления, похожий на wx.Choice (фактически замену wx.Choice), который использует wx.ItemContainer для управления списком элементов. Вот минимальный пример, показывающий ошибку:

import wx
class c(wx.ItemContainer):
    def __init__(my): pass

x = c()
x.Clear()

Это не с:

Traceback (most recent call last):
  File "", line 1, in 
  File "c:\python25\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 1178
7, in Clear
    return _core_.ItemContainer_Clear(*args, **kwargs)
TypeError: in method 'ItemContainer_Clear', expected argument 1 of type 'wxItemContainer *'

Другие элементы управления, использующие ItemContainer, кажутся внутренними по отношению к wxWindows, поэтому я не могу использовать его таким образом. Однако это, безусловно, будет удобно.

Есть идеи, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 28 февраля 2010

wx.ItemContainer не может быть создан напрямую, например попробовать

x = wx.ItemContainer()

выдает ошибку

Traceback (most recent call last):
  File "C:\<string>", line 1, in <module>
  File "D:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 11812, in __init__
    def __init__(self): raise AttributeError, "No constructor defined"
AttributeError: No constructor defined

Причина в том, что это тип интерфейса (если мы можем вызвать его в python), и вы не можете вызвать __init__ для него, вместо этого используйте его как вторую базу и переопределите методы, которые вы используете, например,

class C(wx.PyControl, wx.ItemContainer): 
    def __init__(self, *args, **kwargs):
        wx.PyControl.__init__(self, *args, **kwargs)

    def Clear(self):
        pass

app = wx.PySimpleApp()

frame = wx.Frame(None,title="ItemContainer Test")
x = C(frame)
x.Clear()

frame.Show()
app.SetTopWindow(frame)
app.MainLoop()
0 голосов
/ 28 февраля 2010

Ваши подозрения на правильном пути. Вы не можете создать подкласс любого типа wxWidgets, потому что они находятся в домене C ++ и только номинально заключены в Python. Вместо этого вам нужен класс Py *, который вы можете сделать подклассом. Объяснение дано в этой записи вики о написании пользовательских элементов управления .

Для ItemContainer такой оболочки не существует, и тот факт, что ItemContainer используется в качестве родительского в шаблоне множественного наследования, может даже усложнить ситуацию.

Я подозреваю, что изнутри wxPython, возможно, не удастся заменить ItemContainer - и если он вам понадобится, его нужно будет интегрировать на уровне C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...