2010-02-25 2 views
0

Я пытаюсь создать новый элемент управления wx.Choice (на самом деле это замена для wx.Choice), который использует wx.ItemContainer для управления списком элементов. Вот минимальный пример, показывающий ошибку:Могу ли я использовать wxPython 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, поэтому он не может быть возможным для меня, чтобы использовать его сюда. Однако это было бы удобно.

Любые идеи о том, что я делаю неправильно?

ответ

0

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

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

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

+0

Спасибо за ответ. Я закончил делать что-то подобное. – oofoe

1

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

Это классный трюк. Я буду помнить об этом. В конце концов я создал собственный контроль (см. Выше ответ), но я думаю, что у меня было бы намного легче, если бы я видел ваш ответ. Спасибо за ответ! – oofoe

Смежные вопросы