【问题标题】:wxPython: How to get sizer from wx.StaticText?wxPython:如何从 wx.StaticText 获取 sizer?
【发布时间】:2012-08-15 10:06:10
【问题描述】:

该小部件位于我制作的众多大小调整器之一中,但如何获取这些小部件之一的大小调整器,例如在wx.StaticText 中。首先,我虽然wx.StaticText有一个方法GetSizer(),因为它派生自wx.Window,但它总是返回None,有没有办法?

对不起,我的语言不好。

编辑 (08/23/2012) Mike Driscoll 的解决方案:

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

【问题讨论】:

  • 您能否详细说明您正在尝试做什么? GetSizer() 只会在您之前调用 SetSizer() 时返回一个 sizer。通常,您只在wx.Framewx.Panel 上调用SetSizer()
  • @acattle:实际上,我试图从 sizer 中的小部件中获取所有价值,也许我可以使用来自 sizer 的 GetChildren(),但它只是返回 SizerItemList 而不是实际的小部件列表,所以我想我可以在所有小部件中使用GetSizer() 来返回sizer,当然它什么也不返回。抱歉,我没有说清楚。

标签: wxpython sizer


【解决方案1】:

如果 sizer 有子项,则 GetChildren 会返回一个小部件列表。我已经用 wxPython 2.8 做过很多次了。我不记得有人提到它在 2.9 或 Phoenix 中有所不同,所以我猜它不是。您能告诉我们您使用的是哪个操作系统和 wxPython 版本吗?

如果您想知道如何获取任意大小,您可以尝试 GetContainingSizer 或使用Widget Inspection Tool

编辑(2012 年 8 月 22 日):这是一个工作示例:

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()

【讨论】:

  • 当然sizer有孩子,我加Add(),比如我有两个小部件wx.StaticTextwx.TextCtrl,说我要清除wx.TextCtrl,我可以这个权利? sizer.GetChildren()[1].Clear(),但只是发生错误AttributeError: 'SizerItem' object has no attribute 'Clear',也许我不明白GetChildren() 是如何工作的。我正在使用带有 wxPython 2.8-unicode 的 Windows XP
  • 通常我只使用 self.myTextCtrl.SetValue("") 或 self.myTextCtrl.Clear()。
  • 再看这个,我发现我通常只是调用了面板的 GetChildren(),它可以满足您的需求。 sizer 的工作方式似乎有所不同,在我看来,这是愚蠢的。跟踪sizer 中内容的一种方法是将项目添加到列表中,同时将其添加到sizer 并以这种方式访问​​它们。它不漂亮,但它有效。
  • 谢谢!我确实像你说的那样,我把所有小部件都放在OrderedDict() 中,这样我就可以访问它们,但我仍然感到困惑,为什么面板的GetChildren() 返回实际的小部件而不是用于sizer?无论如何感谢您的帮助。
  • 嗯,我理解面板是“孩子”的“父母”,但我不明白为什么sizer 不能吐出它的内容。我会在 wxPython 邮件列表中询问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2013-08-01
  • 2015-10-25
  • 2012-12-10
相关资源
最近更新 更多