0

wxを使用してpython(2.7)アプリの作成を開始しようとしていますが、まだ理論的な壁がいくつかあるため、実際の成功に懐疑的です。

以下はいくつかの質問です: 1) 私のアプリには多くのウィジェット (ボタン、エントリ、ラベル、コンボボックス) があります - ユーザーがいくつかのイベントを呼び出すと、大部分が追加されます ([追加] ボタンをクリックすると、追加のラベル、エントリ、コンボボックスが作成されます)。ボタン)。ここでの私の質問は、この動的コンテンツを追跡するにはどうすればよいかということです。削除オプションも必要です。私の最善の推測はリストでしたが、コンボボックスのようなものをどのように処理できるかまだわかりません+ウィジェットのグループを削除する方法について少し迷っています。

2) 固定サイズのフレーム/パネルに最適なウィジェット配置の方法はどれですか? xypos の手動設定で問題ありませんか? 1) の私の質問を考慮しても - フレームの途中で何かが削除された場合にレイアウトを処理する方法に主に関心があります - 穴は良くありません。

どうもありがとう

4

1 に答える 1

0

ウィジェットを追加および削除する場合は、サイザーを学びます。ウィジェットの行を追加する場合は、それらすべてのウィジェットを独自のサイザーに入れます。ウィジェットの行を追加する例を次に示します。

import wx

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)
        self.id = 1
        self.row_dict = {}

        self.mainSizer = wx.BoxSizer(wx.VERTICAL)

        addBtn = wx.Button(self, label="Add")
        addBtn.Bind(wx.EVT_BUTTON, self.onAdd)

        self.mainSizer.Add(addBtn, 0, wx.ALL|wx.CENTER, 5)
        self.SetSizer(self.mainSizer)

    #----------------------------------------------------------------------
    def onAdd(self, event):
        """
        Add row of widgets
        """
        sizer = wx.BoxSizer(wx.HORIZONTAL)

        label = wx.StaticText(self, label="Test")
        removeBtn = wx.Button(self, label="Remove row", name=str(self.id))
        removeBtn.Bind(wx.EVT_BUTTON, self.onRemove)

        self.row_dict[str(self.id)] = sizer

        self.id += 1

        sizer.Add(label, 0, wx.ALL, 5)
        sizer.Add(removeBtn, 0, wx.ALL, 5)
        self.mainSizer.Add(sizer)
        self.mainSizer.Layout()

    #----------------------------------------------------------------------
    def onRemove(self, event):
        """
        Remove row
        """
        btn = event.GetEventObject()
        name = btn.GetName()
        print name
        print "removing => ", self.row_dict[name]
        sizer = self.row_dict[name]
        for child in sizer.GetChildren():
            widget = child.GetWindow()
            print widget
            sizer.Remove(widget)

        #self.mainSizer.Remove(self.row_dict[name])
        self.mainSizer.Layout()
        self.Layout()

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

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Add Widgets")
        panel = MyPanel(self)
        self.Show()

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

remove メソッドを正しく動作させることはできませんでしたが、add メソッドはうまく機能します。うまくいけば、これは少なくとも始めるのに役立ちます.

于 2013-07-10T16:20:13.233 に答える