wxPython Boxsizerをスクロールしたい - ぶやかー

wxPythonのスクロールはむずい・・・
Frameじゃなくて特定のBoxsizerだけをスクロールさせるのがかなりしんどかったのでメモしておく。
できるだけ最低限にするため、サイズ調整とかスタイルとかは一切省いておいたよ。

import wx
import wx.lib.scrolledpanel as scrolled

class ScrollSample(wx.Frame):
     def __init__(self, title):
        wx.Frame.__init__(self, None, wx.ID_ANY, title='title')

        ## Root
        self.root_panel = wx.Panel(self, wx.ID_ANY)
        self.root_box = wx.BoxSizer(wx.VERTICAL)
        self.root_panel.SetSizer(self.root_box)

        ## Top Box
        self.top_box = wx.BoxSizer(wx.HORIZONTAL)
        self.root_box.Add(self.top_box)

        self.btn_start = wx.Button(self.root_panel, label='start')
        self.btn_stop = wx.Button(self.root_panel, label='Stop')
        self.top_box.Add(self.btn_start)
        self.top_box.Add(self.btn_stop)

        ## header Box
        self.header_box = wx.BoxSizer(wx.HORIZONTAL)
        self.root_box.Add(self.header_box)

        self.header_a = wx.StaticText(self.root_panel, label='a')
        self.header_b = wx.StaticText(self.root_panel, label='b')
        self.header_c = wx.StaticText(self.root_panel, label='c')
        self.header_d = wx.StaticText(self.root_panel, label='d')
        self.header_box.Add(self.header_a)
        self.header_box.Add(self.header_b)
        self.header_box.Add(self.header_c)
        self.header_box.Add(self.header_d)

        ## Scroll Box
        self.scroll_box = wx.BoxSizer(wx.VERTICAL)
        self.scroll_panel = scrolled.ScrolledPanel(
            self.root_panel, -1, 
            style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER,
            name="panel1"
        )
        self.scroll_panel.SetAutoLayout(1)
        self.scroll_panel.SetupScrolling()
        self.scroll_panel.SetSizer(self.scroll_box)
        self.root_box.Add(self.scroll_panel, 1, wx.EXPAND)

        ## Scroll Row
        for i in range(10):
            row = wx.BoxSizer(wx.HORIZONTAL)
            self.scroll_box.Add(row)
            for i in "a b c d".split():
                text = wx.TextCtrl(self.scroll_panel, value=i)
                row.Add(text)

class SampleApp(wx.App):
    def OnInit(self):
        frame = ScrollSample('ScrollSample')
        self.SetTopWindow(frame)
        frame.Show(True)
        # import scapy.all
        return True


if __name__ == "__main__":
    app = SampleApp()
    app.MainLoop()

この記事を書いた人 Wrote this article

kmatsunuma

TOP