wxPython:如何从wx.StaticText获取sizer?

wxPython:如何从wx.StaticText获取sizer?,wxpython,sizer,Wxpython,Sizer,这个小部件是我制作的许多大小部件中的一个,但是如何获取其中一个小部件的大小部件,例如在wx.StaticText中。首先,我认为wx.StaticText有一个方法GetSizer(),因为它派生自wx.Window,但它总是返回None,有办法吗 对不起,我的语言不好 编辑(2012年8月23日)Mike Driscoll提供的解决方案: 使用self.sizer.GetChildren()从某个大小器中获取SizerItemList,然后使用GetWindow()从列表中获取实际的小部件如果

这个小部件是我制作的许多大小部件中的一个,但是如何获取其中一个小部件的大小部件,例如在
wx.StaticText
中。首先,我认为wx.StaticText有一个方法
GetSizer()
,因为它派生自
wx.Window
,但它总是返回
None
,有办法吗

对不起,我的语言不好

编辑(2012年8月23日)Mike Driscoll提供的解决方案:


使用
self.sizer.GetChildren()
从某个大小器中获取
SizerItemList
,然后使用
GetWindow()
从列表中获取实际的小部件

如果大小器有子部件,则GetChildren确实返回小部件列表。我已经用WxPython2.8做过很多次了。我不记得有人提到它在2.9或凤凰城是不同的,所以我猜它不是。您能告诉我们您使用的是哪个操作系统和wxPython版本吗

如果您想知道如何获取任意大小的文件,可以尝试GetContainingSizer或使用

编辑(08/22/2012):下面是一个工作示例:

import wx

########################################################################
class MyApp(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Example")
        panel = wx.Panel(self)

        lbl = wx.StaticText(panel, label="I'm a label!")
        txt = wx.TextCtrl(panel, value="blah blah")
        btn = wx.Button(panel, label="Clear")
        btn.Bind(wx.EVT_BUTTON, self.onClear)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(lbl, 0, wx.ALL, 5)
        self.sizer.Add(txt, 0, wx.ALL, 5)
        self.sizer.Add(btn, 0, wx.ALL, 5)

        panel.SetSizer(self.sizer)

    #----------------------------------------------------------------------
    def onClear(self, event):
        """"""
        children = self.sizer.GetChildren()

        for child in children:
            widget = child.GetWindow()
            print widget
            if isinstance(widget, wx.TextCtrl):
                widget.Clear()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyApp()
    frame.Show()
    app.MainLoop()

你能详细描述一下你想做什么吗?仅当您以前调用
SetSizer()
时,才会返回一个sizer。通常,您只在
wx.Frame
wx.Panel
@acattle上调用
SetSizer()
:实际上,我试图从sizer内的小部件获取所有值,也许我可以从sizer使用
GetChildren()
,但它只返回SizerItemList而不是实际的小部件列表,所以我想我可以使用
GetSizer()
在所有窗口小部件中返回sizer,当然它不返回任何内容。抱歉,我没有说清楚。当然,sizer有子项,我用
add()
添加它们,例如我有两个小部件
wx.StaticText
wx.TextCtrl
,如果我想清除
wx.TextCtrl
,我可以这样做吗
sizer.GetChildren()[1].Clear()
,但刚刚发生错误
AttributeError:“SizerItem”对象没有属性“Clear”
,可能我不明白
GetChildren()
是如何工作的。我将Windows XP与wxPython 2.8-Unicode一起使用,我只使用self.myTextCtrl.SetValue(“”)或self.myTextCtrl.Clear()。在我看来,施胶器的工作方式似乎不同,而且是愚蠢的。跟踪sizer中的内容的一种方法是,将项目添加到列表中,同时将其添加到sizer并以这种方式访问。它不漂亮,但很管用。谢谢!我就像你说的那样,我把所有的小部件都放在
orderedict()
中,这样我就可以访问它们了,但仍然让我感到困惑,为什么面板的
GetChildren()
返回实际的小部件而不是sizer?无论如何,谢谢你的帮助。好吧,我理解这个面板,因为它是“孩子”的“家长”,但我不明白为什么施胶器不能吐出它的内容。我会在wxPython邮件列表上询问。