0

このコードは、 Stackoverflow ScrolledPanel inside Panel not sizingのトピックから取得しました。それは私にとってはうまくいきます。ただし、 scrolled_pa​​nel のすべての子を破棄してから、新しい子を再作成したいと考えています。そこで、次のようにコードを変更します。

import wx
import wx.lib.scrolledpanel as scrolled

########################################################################
class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial", size=(200,500))

        self.n = 13
        # Add a panel so it looks the correct on all platforms
        self.panel = wx.Panel(self, wx.ID_ANY)

        # --------------------
        # Scrolled panel stuff
        self.scrolled_panel = scrolled.ScrolledPanel(self.panel, -1, 
                                 style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="panel1")
        self.scrolled_panel.SetAutoLayout(1)
        self.scrolled_panel.SetupScrolling()

        words = "A Quick Brown Insane Fox Jumped Over the Fence and Ziplined to Cover".split()
        self.spSizer = wx.BoxSizer(wx.VERTICAL)
        for word in words:
            text = wx.TextCtrl(self.scrolled_panel, value=word)
            self.spSizer.Add(text)
        self.scrolled_panel.SetSizer(self.spSizer)
        # --------------------

        btn = wx.Button(self.panel, label="Add Widget")
        btn.Bind(wx.EVT_BUTTON, self.onAdd)

        panelSizer = wx.BoxSizer(wx.VERTICAL)
        panelSizer.AddSpacer(50)
        panelSizer.Add(self.scrolled_panel, 1, wx.EXPAND)
        panelSizer.Add(btn)
        self.panel.SetSizer(panelSizer)

    #----------------------------------------------------------------------
    def onAdd(self, event):
        """"""
        print "in onAdd"
        self.n += 1
        self.scrolled_panel.DestroyChildren()
        for i in range(self.n):
            new_text = wx.TextCtrl(self.scrolled_panel, value="New Text %s" % i)
            self.spSizer.Add(new_text)
        #new_text = wx.TextCtrl(self.scrolled_panel, value="New Text")
        #self.spSizer.Add(new_text)
        self.scrolled_panel.Layout()
        self.scrolled_panel.SetupScrolling()


# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm().Show()
    app.MainLoop()

現在、パネルのサイズを超えて子を作成しても、スクロール バーが元のコードとして表示されません。誰でもこれで私を助けることができますか? よろしくお願いします!!!

4

1 に答える 1

0

testpanel を追加して scrolledPanel を追加することで、この問題を解決しました。onAdd() が呼び出されない場合、testpanel のすべての子を破棄した後、testpanel の下のすべてをサイザーも含めて再作成し、再セットアップする必要があります。

テストパネルなしでそのようにしようとしましたが、マウスを使用してスクロールすることはできましたが、スクロールバーが表示されませんでした.理由はわかりません. これは私の新しいコードです:

import wx
import wx.lib.scrolledpanel as scrolled


########################################################################
class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial", size=(200,500))
        self.n =17
        # Add a panel so it looks the correct on all platforms
        self.panel = wx.Panel(self, wx.ID_ANY)
        panelSizer = wx.BoxSizer(wx.VERTICAL)
        panelSizer.AddSpacer(50)
        # add a panel
        self.testpanel = wx.Panel(self.panel, wx.ID_ANY)

        #self.testpanel.SetSizer(self.testpanelSizer)
        panelSizer.Add(self.testpanel, 1, wx.EXPAND)

        self.onAdd()
        btn = wx.Button(self.panel, label="Add Widget")
        btn.Bind(wx.EVT_BUTTON, self.onAdd)
        panelSizer.Add(btn)


        self.panel.SetSizer(panelSizer)

    #----------------------------------------------------------------------
    def onAdd(self, event=None):
        self.n +=1
        self.testpanel.DestroyChildren()
        testpanelSizer = wx.BoxSizer(wx.VERTICAL)
        scrolled_panel = scrolled.ScrolledPanel(self.testpanel, -1, 
                                 style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="panel1")
        scrolled_panel.SetAutoLayout(1)
        scrolled_panel.SetupScrolling()

        spSizer = wx.BoxSizer(wx.VERTICAL)
        for i in range(self.n):
            new_text = wx.TextCtrl(scrolled_panel, value="New Text %s" % i)
            spSizer.Add(new_text)
        scrolled_panel.SetSizer(spSizer)

        testpanelSizer.Add(scrolled_panel, 1, wx.EXPAND)
        self.testpanel.SetSizer(testpanelSizer)
        self.testpanel.Layout()


# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm().Show()
    app.MainLoop()
于 2013-04-24T15:32:31.143 に答える