wxPython: Как получить размер из wx.StaticText?

Виджет находится в одном из многих сайзеров, которые я делаю, но как получить сайзер одного из этих виджетов, например в wx.StaticText. Во-первых, хотя у wx.StaticText есть метод GetSizer(), потому что он производный от wx.Window, но он всегда возвращает None, есть ли способ?

Извините за мой плохой язык.

EDIT (23.08.2012) Решение Майка Дрисколла:

Использование self.sizer.GetChildren() для получения SizerItemList из некоторого сайзера, затем использование GetWindow() для получения фактического виджета из списка


person Kyomuu    schedule 20.08.2012    source источник
comment
Не могли бы вы предоставить подробное описание того, что вы пытаетесь сделать? GetSizer() вернет сайзер только в том случае, если ваш предыдущий вызов SetSizer(). Обычно вы вызываете SetSizer() только на wx.Frame или wx.Panel.   -  person acattle    schedule 20.08.2012
comment
@acattle: На самом деле, я пытался получить все значения из виджетов внутри сайзера, может быть, я могу использовать GetChildren() из сайзера, но он просто возвращает SizerItemList, а не фактический список виджетов, поэтому я думаю, что могу использовать GetSizer() в все виджеты возвращают сайзер, конечно, он ничего не возвращает. Извините, не выразился.   -  person Kyomuu    schedule 20.08.2012


Ответы (1)


Если у сайзера есть дочерние элементы, то GetChildren возвращает список виджетов. Я делал это много раз с wxPython 2.8. Я не помню, чтобы кто-нибудь упоминал, что в 2.9 или Phoenix это было иначе, так что я предполагаю, что это не так. Можете ли вы сказать нам, какую ОС и версию wxPython вы используете?

Если вы хотите узнать, как получить произвольный размер, вы можете попробовать GetContainingSizer или использовать инструмент проверки виджетов< /а>

РЕДАКТИРОВАТЬ (22.08.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()
person Mike Driscoll    schedule 20.08.2012
comment
Конечно, у сайзера есть дети, я добавляю их с помощью Add(), например, у меня есть два виджета wx.StaticText и wx.TextCtrl, скажем, я хочу очистить wx.TextCtrl, я могу сделать это правильно? sizer.GetChildren()[1].Clear(), но просто возникает ошибка AttributeError: 'SizerItem' object has no attribute 'Clear', возможно я не понимаю, как работает GetChildren(). Я использую Windows XP с wxPython 2.8-unicode. - person Kyomuu; 21.08.2012
comment
Обычно я просто использую self.myTextCtrl.SetValue() или self.myTextCtrl.Clear(). - person Mike Driscoll; 21.08.2012
comment
Глядя на это еще немного, я вижу, что обычно я просто вызывал панель GetChildren(), которая делает то, что вы хотите. Сайзер работает по-другому и, на мой взгляд, глупо. Один из способов следить за тем, что находится в сайзере, — это добавлять элементы в список одновременно с добавлением сайзера и получать к ним доступ таким образом. Это некрасиво, но это работает. - person Mike Driscoll; 21.08.2012
comment
Спасибо! Я сделал, как вы сказали, я поместил все виджеты в OrderedDict(), чтобы иметь к ним доступ, все еще меня сбивая с толку, почему панель GetChildren() возвращает фактические виджеты, а не размер? в любом случае спасибо за вашу помощь. - person Kyomuu; 22.08.2012
comment
Ну панель я понимаю тем, что она родитель детей, но не понимаю, почему сайзер не может выплюнуть ее содержимое. Я спрошу в списке рассылки wxPython. - person Mike Driscoll; 22.08.2012
comment
Я добавил пример кода. Коди Прекорд указал мне правильное направление в группе пользователей wxPython. - person Mike Driscoll; 22.08.2012
comment
Блестящий и красивый! GetWindow() действительно верните настоящий виджет из SizerItemList, я многому научился, благодаря вам и мистеру Прекорду - person Kyomuu; 23.08.2012