6

BoxSizer に 6 つのボタンを追加する次のコードがあります。

for word in words:
    btn = wx.Button(self, label=word)
    btn.Bind(wx.EVT_BUTTON, self.onWordSelect)

私のonWordSelect方法では、新しいボタンを再作成できるように、サイザーで作成したすべてのボタンを削除しようとしています。私の問題は、最後のボタンを除いてすべてのボタンが削除されることです。

ボタンを削除するための私のコードは次のとおりです。

for child in self.sizer.GetChildren():
    self.sizer.Remove(child.Window)
    self.sizer.Layout()

チェックするlen(self.sizer.GetChildren())と が返されます0が、最後のボタンは画面に表示されたままです。

4

5 に答える 5

4

http://wxpython.org/docs/api/wx.Sizer-class.html#Removeから:

歴史的な理由から、このメソッドを wx.Window パラメーターで呼び出すことは非推奨です。ウィンドウはその親によって所有されているため、ウィンドウを破棄できないからです。代わりに Detach を使用してください。

サイザーから要素を削除しましたが、それらはまだ存在しており、重ねて印刷されています。ループに 1 行destroyまたはhideそれらを追加すると、うまくいくはずです。

于 2012-12-11T07:16:17.163 に答える
3

ドキュメントを少し掘り下げた後、すべてのコントロールを削除する最も簡単な方法は、self.sizer.DeleteWindows()各ボタンをループで個別に削除する代わりに使用することであることがわかりました。

于 2012-12-11T08:01:33.017 に答える
0

クレイマーの破棄コメントを明確にするために、私が抱えていた問題をどのように解決したかを次に示します。

class myFrame(wx.Frame):
    def__init__(self, title):
        #make the FlexGridSizer specifying only the columns, not the rows
        #make a panel
        #create widgets with the panel as the parent
        #add widgets to the sizer
        self.addLastRow()
        #set the sizer, call layout, etc...

    def addLastRow(self):
        lastBtn = wx.Button(self.myScrolledPanel, -1,"Add New Row", style=wx.BU_EXACTFIT)
        numBlanks = self.numTotalColumns-1
        for i in range(numBlanks):
            self.myFlexGridSizer.AddF(wx.StaticText(self.myScrolledPanel, -1, ''), wx.SizerFlags(0))
        self.myFlexGridSizer.AddF(lastBtn, wx.SizerFlags(0))
        self.Bind(wx.EVT_BUTTON, self.AddNewRowElements, addButton)

    def removeLastRow(self):
        myFlexGridItems = self.myFlexGridSizer.GetChildren()
        for i in range(self.numTotalColumns):
            myFlexGridItems[len(myFlexGridItems)-1].GetWindow().Destroy()

    def AddNewRowElements(self, event):
        self.removeLastRow()
        #add elements
        self.addLastRow()
        self.myFlexGridSizer.Layout()
于 2014-05-10T03:21:23.373 に答える
0

次のように実行できます。

buf = []
for word in words:
    btn = wx.Button(self, label=word)
    btn.Bind(wx.EVT_BUTTON, self.onWordSelect)
    buf.append(btn)
......
for n,i in enumerate(buf):
    self.sizer.Hide(buf[n])
    self.sizer.Remove(buf[n])
    self.sizer.Layout()
于 2018-09-18T05:02:54.203 に答える