【问题标题】:Can I use wxPython wx.ItemContainer in a derived class?我可以在派生类中使用 wxPython wx.ItemContainer 吗?
【发布时间】:2010-02-25 16:20:09
【问题描述】:

我正在尝试制作一个新的类似 wx.Choice 的控件(实际上是 wx.Choice 的替代品),它使用 wx.ItemContainer 来管理项目列表。这是一个显示错误的最小示例:

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

x = c()
x.Clear()

这失败了:

回溯(最近一次通话最后): 文件“”,第 1 行,在 文件“c:\python25\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py”,第 1178 行 7、在清除 return _core_.ItemContainer_Clear(*args, **kwargs) TypeError:在方法“ItemContainer_Clear”中,预期参数 1 类型为“wxItemContainer *”

使用 ItemContainer 的其他控件似乎是 wxWindows 内部的,因此我可能无法以这种方式使用它。但是,这肯定会很方便。

关于我做错了什么有什么想法吗?

【问题讨论】:

    标签: python wxpython


    【解决方案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()
    

    【讨论】:

    • 这是一个很酷的技巧。我会记住这一点。我最终创建了自己的控件(见上面的答案),但我想如果我看到你的回复,我会更轻松。感谢您的回答!
    【解决方案2】:

    您的怀疑是正确的。您不能对任何 wxWidgets 类型进行子类化,因为它们位于 C++ 域中并且只是名义上包装在 Python 中。相反,您需要一个可以子类化的 Py* 类。解释在this Wiki entry on writing custom controls中给出。

    对于 ItemContainer,似乎没有这样的包装器 - 而 ItemContainer 在多重继承模式中用作父级这一事实甚至可能使事情复杂化。

    我怀疑在 wxPython 中,可能无法替换 ItemContainer——如果确实需要,它必须在 C++ 级别集成。

    【讨论】:

    • 感谢您的回答。我最终做了这样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2017-08-02
    • 1970-01-01
    • 2010-10-09
    • 2012-10-29
    • 2021-07-07
    • 2015-05-06
    相关资源
    最近更新 更多