0

別の GUI とコントローラーを使用して、MVC のアイデアの下でアプリケーションを構築したいと考えています。さらに、私にはグラフィカルなタスクで私よりもはるかに優れた同僚がいて、作業を分散したいと考えています。彼は wxFormBuilder でグラフィカルな部分を構築し、私はアプリケーションの「機械」を構築します。

GUI を生成したら、wxFormbuilder が管理できないいくつかの要素を代用したいと思います。たとえば、wxObjectListView です。私の考えは、通常の wxListBox を使用して GUI を作成し、それをメイン プログラムにインポートして、wxObjectListView に置き換えることです。GUI エディタとの下位互換性を維持したいので、wxFormBuilder によって生成されたコードを直接変更したくありません。

問題と質問は次のとおりです。GUI をインポートするメイン プログラムから、リストを含むサイザーにアクセスし、削除して ObjectListView で置き換えるにはどうすればよいですか? sizer.Delete(list) の次に sizer.Add(olv)... のようなもの

ここにあなたの例があります:

wxFormBuilder によって生成された GUI コード: リストとボタンを含むフレーム。

# -*- coding: utf-8 -*- 

###########################################################################
## Python code generated with wxFormBuilder (version Sep  8 2010)
## http://www.wxformbuilder.org/
##
## PLEASE DO "NOT" EDIT THIS FILE!
###########################################################################

import wx

###########################################################################
## Class MyFrame1
###########################################################################

class MyFrame1 ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 330,288 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )

        fgSizer = wx.FlexGridSizer( 2, 1, 0, 0 )
        fgSizer.AddGrowableCol( 0 )
        fgSizer.AddGrowableRow( 0 )
        fgSizer.SetFlexibleDirection( wx.BOTH )
        fgSizer.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED )

        m_listBox1Choices = [ u"Row1", u"Row2" ]
        self.m_listBox1 = wx.ListBox( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_listBox1Choices, 0 )
        fgSizer.Add( self.m_listBox1, 1, wx.ALL|wx.EXPAND, 5 )

        self.m_button1 = wx.Button( self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0 )
        fgSizer.Add( self.m_button1, 1, wx.ALL|wx.EXPAND, 5 )

        self.SetSizer( fgSizer )
        self.Layout()

        self.Centre( wx.BOTH )

    def __del__( self ):
        pass

そして、これがグラフィカル クラスをインポートするメイン コードです。

from __future__ import print_function
# -*- coding: utf-8 -*-
import wx
from olvGUI import MyFrame1

class Ventana(MyFrame1):

    def inicia(self):
        hijos = self.GetChildren()
        for h in hijos:
            print(h)


if __name__ == "__main__":
    app = wx.App(False)
    v = Ventana(None)
    v.inicia()
    v.Show()
    app.MainLoop()

Frame の子にアクセスしようとすると、Sizer ではなく、「最終」オブジェクトのみが表示されます。

<wx._controls.ListBox; proxy of <Swig Object of type 'wxListBox *' at 0x1e0cea8> >
<wx._controls.Button; proxy of <Swig Object of type 'wxButton *' at 0x19a5f90> >

要素にアクセスできるようにするには、GUI に別の構造が必要なのかもしれませんが、それを作成する方法がわかりません。2 レベルのサイザーを作成しようとしましたが、最終結果は同じです。サイザーではなく、最終要素にアクセスできます。

4

1 に答える 1

1

後でアクセスできるように変更する必要がありfgSizerます。self.fgSizer次に、サイザーのRemoveメソッドを使用してウィジェットを削除できます。Insertその場所に別のウィジェットを挿入するために使用できる方法があります。

詳細については、サイザーに関するドキュメントを参照してください。

Layoutウィジェットを削除および挿入しているため、そのメソッドの最後で呼び出す必要がある可能性が高くなります。この記事には例があります:

最後に、サイザーを取得する例を次に示します。

import wx

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

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

        sizer = wx.BoxSizer(wx.VERTICAL)

        btn = wx.Button(self.panel, label="Get sizer")
        btn.Bind(wx.EVT_BUTTON, self.onGetSizer)
        sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
        self.panel.SetSizer(sizer)

        self.Show()

    #----------------------------------------------------------------------
    def onGetSizer(self, event):
        """"""
        sizer = self.panel.GetSizer()

if __name__ == '__main__':
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

ウィジェットのインデックスを保存する例を次に示します。

self.widget_dict = {}
some_boxsizer.Add(some_widget)  # this is the first widget, so its ID is zero
self.widget_dict[some_widget] = 0

イベント ハンドラーで、このディクショナリを使用して、どのウィジェットがどのインデックスにあるかを判断できます。

index = self.widget_dict[some_widget]
于 2015-05-15T13:51:49.933 に答える