0

ビットマップボタンのサブリストのサイズを調整する wxpython グリッドサイザーがあります。これらのボタンの作成にはかなりの時間がかかり、それらを破棄したくないため、マスター リストを一度だけ作成したいと考えています。私のアイデアは、何らかの方法でサイザーからすべてのボタンを削除し、サイザーに含めるボタンの新しいリストを作成してから、サイザーの AddMany メソッドを使用することです。

ボタンを破壊せずにサイザーからボタンを削除できない場合、サイザーの Show メソッドを使用していくつかの時間を非表示にし、サイザーを調整してギャップを埋める方法はありますか? それらを非表示にすると、今できることは、それらを非表示にして隙間を空けることだけです。ギャップの場所に合わせて次の項目を調整する必要があります。

また、グリッドサイザーのアイテムリストをソートする方法はありますか?

ご協力いただきありがとうございます。

4

4 に答える 4

0

サイジングアイテムをその場でソートすることはできません。もちろん、これを行うための独自の関数を作成することは可能ですが、いずれにせよ内部でwxSizer::Detach()andを使用しInsert()ます。

于 2013-08-06T17:10:07.000 に答える
0

サイザーの親で Layout メソッドを呼び出すことができるはずです。これにより、表示されるアイテムが再計算されます。

于 2013-08-06T12:06:33.867 に答える
0

ボタンを並べ替えるのは少し難しいですが、重要なのは並べ替えるものを見つけることです。ボタン ラベルまたはボタン名を使用できます。私は後者で行きました。次のコードは、ボタンを表示/非表示にする方法も示しています。

import random
import wx

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

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

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

        for item in range(10):
            val = random.choice(range(10000,99999))
            label = "Button %s" % val
            name = "btn%s" % val
            btn = wx.Button(self, label=label, name=name)
            self.mainSizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)

        toggleBtn = wx.Button(self, label="Hide/Show Some Buttons")
        toggleBtn.Bind(wx.EVT_BUTTON, self.onHideShow)
        hSizer.Add(toggleBtn, 0, wx.ALL, 5)

        sortBtn = wx.Button(self, label="Sort buttons")
        sortBtn.Bind(wx.EVT_BUTTON, self.onSort)
        hSizer.Add(sortBtn, 0, wx.ALL, 5)

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

    #----------------------------------------------------------------------
    def onHideShow(self, event):
        """
        Hide / Show the buttons
        """
        children = self.mainSizer.GetChildren()
        for child in children:
            widget = child.GetWindow()
            if isinstance(widget, wx.Button):
                if widget.IsShown():
                    widget.Hide()
                else:
                    widget.Show()

    #----------------------------------------------------------------------
    def onSort(self, event):
        """
        Sort the buttons
        """
        children = self.mainSizer.GetChildren()
        buttons = []
        for child in children:
            widget = child.GetWindow()
            if isinstance(widget, wx.Button):
                buttons.append(widget)
                self.mainSizer.Detach(widget)

        sortedBtns =  sorted([btn for btn in buttons], key = lambda y: y.GetName())
        # need to prepend them in reverse order to keep the two control buttons on the bottom
        sortedBtns.reverse()
        for btn in sortedBtns:
            self.mainSizer.Prepend(btn, 0, wx.ALL|wx.CENTER, 5)
        self.Layout()

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

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Test", size=(600,800))
        panel = MyPanel(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()
于 2013-08-06T13:58:35.900 に答える