2

リファクタリングセッション中に、多くのGUIコードを小さな関数に入れて、データをwx.Sizerオブジェクトに直接挿入します。

たとえば、この小さな関数は次のとおりです。

def buildStatusDisplay(self, status_disp, flag):
    grid = wx.FlexGridSizer(cols=1, hgap=5, vgap=0)
    font = wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.LIGHT, False, 'Segoe UI')
    for option in status_disp:
        left = wx.StaticText(self, -1, option)
        left.SetFont(font)
        grid.Add(left, 0, flag=flag)
    return grid

したがって、throwawayを使用してすべてのStaticTextオブジェクトを作成し、leftを返しますFlexGrid。ただし、ユーザー入力に基づいて更新するには、StaticTextオブジェクトのラベルの一部が必要ですが、それらにアクセスする方法がわかりません。

関数から返されるサイザーをループしましたが、サイザーを構成するオブジェクトへの参照を取得する方法に関連するものは何もありません。

for i in dir(sizer):
    print i 

>>Add
>>AddF
>>AddGrowableCol
>>AddGrowableRow
>>AddItem
>>AddMany
>>AddSizer
>>AddSpacer
>>AddStretchSpacer
>>AddWindow
>>CalcMin
>>CalcRowsCols
>>Children
>>ClassName
>>Clear
>>ColWidths
>>Cols
>>ComputeFittingCli
>>ComputeFittingWin
>>ContainingWindow
>>DeleteWindows
>>Destroy
>>Detach
>>Fit
>>FitInside
>>FlexibleDirection
>>GetChildren
>>GetClassName
>>GetColWidths
>>GetCols
>>GetContainingWind
>>GetFlexibleDirect
>>GetHGap
>>GetItem
>>GetItemIndex
>>GetMinSize
>>GetMinSizeTuple
>>GetNonFlexibleGro
>>GetPosition
>>GetPositionTuple
>>GetRowHeights
>>GetRows
>>GetSize
>>GetSizeTuple
>>GetVGap
>>HGap
>>Hide
>>Insert
>>InsertF
>>InsertItem
>>InsertSizer
>>InsertSpacer
>>InsertStretchSpac
>>InsertWindow
>>IsSameAs
>>IsShown
>>Layout
>>MinSize
>>NonFlexibleGrowMo
>>Position
>>Prepend
>>PrependF
>>PrependItem
>>PrependSizer
>>PrependSpacer
>>PrependStretchSpa
>>PrependWindow
>>RecalcSizes
>>Remove
>>RemoveGrowableCol
>>RemoveGrowableRow
>>RemovePos
>>RemoveSizer
>>RemoveWindow
>>Replace
>>RowHeights
>>Rows
>>SetCols
>>SetContainingWind
>>SetDimension
>>SetFlexibleDirect
>>SetHGap
>>SetItemMinSize
>>SetMinSize
>>SetNonFlexibleGro
>>SetRows
>>SetSizeHints
>>SetVGap
>>SetVirtualSizeHin
>>Show
>>ShowItems
>>Size
>>VGap
>>_ReplaceItem
>>_ReplaceSizer
>>_ReplaceWin
>>_SetItemMinSize
>>__class__
>>__del__
>>__delattr__
>>__dict__
>>__doc__
>>__format__
>>__getattribute__
>>__hash__
>>__init__
>>__module__
>>__new__
>>__reduce__
>>__reduce_ex__
>>__repr__
>>__setattr__
>>__sizeof__
>>__str__
>>__subclasshook__
>>__swig_destroy__
>>__weakref__
>>_setOORInfo

GetChildren()SizerItems基になるオブジェクトへの参照も保持していないように見えるものだけを返します。

サイザー内の何かにアクセスする方法を知っている人はいますか?関数を少し分解して、オブジェクトとサイザーのリストを返すか、関数を単純にダンプして、メインで変更する必要のあるオブジェクトの識別子を保持できると思います。しかし...私のGUIコードすでに十分なスパゲッティです。避けられれば避けたいと思います。

4

3 に答える 3

2

にはwx.SizerItemGetWindowまさにそれを提供する があります。使用IsWindow可能な「ウィンドウ」があるかどうかを確認するために使用します。基礎となるすべてのオブジェクトは から継承するwx.Windowため、それが必要です。

例を次に示します。objこれはwx.Frameオブジェクトです。

>>> obj
<main.views.Main; proxy of <Swig Object of type 'wxFrame *' at 0x7fbaa1c70820> >
>>> obj.Sizer
<wx._core.BoxSizer; proxy of <Swig Object of type 'wxBoxSizer *' at 0x7fba9c9d48d0> >
>>> obj.Sizer.Children
wxSizerItemList: [<wx._core.SizerItem; proxy of <Swig Object of type 'wxSizerItem *' at 0x7fbaa1c21630> >, <wx._core.SizerItem; proxy of <Swig Object of type 'wxSizerItem *' at 0x7fbaa1c7faf0> >]
>>> obj.Sizer.Children[0]
<wx._core.SizerItem; proxy of <Swig Object of type 'wxSizerItem *' at 0x7fbaa1c21630> >
>>> obj.Sizer.Children[0].Window
<wx._windows.Panel; proxy of <Swig Object of type 'wxPanel *' at 0x7fba9c9d4d10> >
于 2013-01-16T20:05:31.590 に答える
1

私は数ヶ月前にこの種の質問に実際に答えました: wxPython: wx.StaticText からサイザーを取得する方法は?

基本的に、次のようなことをする必要があります。

children = self.sizer.GetChildren()

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

この場合、wx.TextCtrl をチェックしているだけであることがわかりますが、好きなウィジェットをチェックできます。また、この件に関する記事をブログに書きました。

于 2013-01-16T22:56:09.330 に答える