wxPython:为什么 wx.ScrollBar 在调整面板大小后不调整大小?

问题描述 投票:0回答:0

所以我在wx.Panle中创建了一个wx.ScrollBar,并在带有StaticBox sizer的父面板中创建了这个wx.Panel。

content_panel = wx.Panel(parent, wx.ID_ANY)
staticBox = widgets.CustomStaticBox(content_panel, wx.ID_ANY,
                                    border_thickness = 1, size = size,
                                    border_color = self.sys_variables["sys_config"]["COLOR_CONTENT_PANEL_INSIDE_BORDER"],
                                    margin = margin, radius = 0)
sizer = wx.StaticBoxSizer(staticBox, wx.HORIZONTAL)
content_panel.SetSizer(sizer)

content = ContentWorkplace(content_panel, wx.ID_ANY, size = size)

class ContentWorkplace(wx.Panel):
    def __init__(self, parent = None, id = wx.ID_ANY,
                 pos = wx.DefaultPosition, size = wx.DefaultSize,
                 style = 0, name = "ContentWorkplace"):
        wx.Panel.__init__(self, parent, id, pos, size, style, name)
        self.call_back_variables = None
        self.data = None
        self.add_mission_button = None
        self.parent = self.GetParent()
        self.parent.scroll_bar = None

        self.Bind(wx.EVT_PAINT, self.on_paint)

    def on_paint(self, event):
        apis.API_GET_PRODUCT_MISSIONS(self, event)
        self.data = self.call_back_variables["data"]
        # self.data = None

        parent_sizer = self.parent.GetSizer()
        parent_static_box = parent_sizer.GetStaticBox()

        new_size = self.GetParent().GetSize()
        margin = parent_static_box.margin * 2
        self.SetPosition((margin, margin))
        self.SetSize(new_size - (margin, margin))
        self.SetBackgroundColour(wx.RED) # this color is just help me to know where this panel is, and it doesn't work correctly now, this is another problem here

        if self.data is not None and len(self.data) > 0:
            print("need some blocks and show every picture here")

            if self.GetSizer() is None:
                box_sizer = wx.BoxSizer(wx.HORIZONTAL)

                mission_count = len(self.data)
                rows = math.ceil(mission_count / GRID_COLUMNS) + 1
                sizer = wx.GridSizer(rows, GRID_COLUMNS, 0, 0)

                has_scroller = False
                has_scroller = True
                parent_static_box.has_scroller = has_scroller

                self.parent.scroll_bar = wx.ScrollBar(self.parent, pos = (new_size[0] - 16, 0),
                                                      size = (0, new_size[1]), style = wx.SB_VERTICAL)
                self.parent.scroll_bar.Bind(wx.EVT_SCROLL_THUMBTRACK, self.scroll_thumbtrack)


                # these are test widgets, just ignore it
                element_size = self.get_mission_content_size(new_size, has_scroller)
                btn = wx.Button(self, wx.ID_ANY, label = "asdfasdf", size = element_size)
                btn.SetPosition(self.GetPosition() + (100, 100))
                sizer.Add(btn, 0, wx.LEFT | wx.TOP | wx.EXPAND, GAP_BETWEEN_MISSION)

                btn = wx.Button(self, wx.ID_ANY, label = "asdfasdf", size = element_size)
                sizer.Add(btn, 0, wx.LEFT | wx.TOP | wx.EXPAND, GAP_BETWEEN_MISSION)

                btn = wx.Button(self, wx.ID_ANY, label = "asdfasdf", size = element_size)
                sizer.Add(btn, 0, wx.LEFT | wx.TOP | wx.EXPAND, GAP_BETWEEN_MISSION)

                btn = wx.Button(self, wx.ID_ANY, label = "asdfasdf", size = element_size)
                sizer.Add(btn, 0, wx.LEFT | wx.TOP | wx.EXPAND, GAP_BETWEEN_MISSION)

                btn = wx.Button(self, wx.ID_ANY, label = "asdfasdf", size = element_size)
                sizer.Add(btn, 0, wx.LEFT | wx.TOP | wx.EXPAND, GAP_BETWEEN_MISSION)

                btn = wx.Button(self, wx.ID_ANY, label = "asdfasdf", size = element_size)
                sizer.Add(btn, 0, wx.LEFT | wx.TOP | wx.EXPAND, GAP_BETWEEN_MISSION)

                btn = wx.Button(self, wx.ID_ANY, label = "asdfasdf", size = element_size)
                sizer.Add(btn, 0, wx.LEFT | wx.TOP | wx.EXPAND, GAP_BETWEEN_MISSION)

                box_sizer.Add(sizer)
                self.SetSizer(box_sizer)
                box_sizer.Fit(self)


            if self.parent.scroll_bar is not None:
                self.parent.scroll_bar.SetSize((0, new_size[1])) # This doesn't work, it's werid
                self.parent.scroll_bar.SetPosition((new_size[0] - 16, 0)) # This works
                self.parent.scroll_bar.SetScrollbar(0, 0, new_size[1], 2)
                self.parent.scroll_bar.Layout()
                self.parent.scroll_bar.Fit()


            # missionProductSides = self.data.GetMissionProductSides()
            # missionName = self.data.GetMissionName()
        else:
            if self.add_mission_button is None:
                self.add_mission_button = widgets.CustomRadiusButton(self, wx.ID_ANY, label = "Click And Add Mission",
                                                                     font_color = configs.COLOR_BUTTON_TEXT,
                                                                     background_color = configs.COLOR_BUTTON_BACKGROUND,
                                                                     clicked_color = configs.COLOR_BUTTON_CLICKED,
                                                                     button_type = widgets.BUTTON_TYPE_NORMAL,
                                                                     size = self.get_button_size(new_size), radius = 3)
                self.add_mission_button.Bind(wx.EVT_LEFT_DOWN, self.button_on_click)
            else:
                self.add_mission_button.SetSize(self.get_button_size(new_size))
            self.add_mission_button.Center()
            self.add_mission_button.Refresh()
        self.Fit()
        event.Skip()

    def get_button_size(self, content_size):
        return content_size[0] / 8, content_size[1] / 10

    def get_mission_content_size(self, content_size, has_scroller):
        if has_scroller:
            return (content_size[0] - 16 - GAP_BETWEEN_MISSION * 5) / 4, content_size[1] / 3
        return (content_size[0] - GAP_BETWEEN_MISSION * 5) / 4, content_size[1] / 3

    def scroll_thumbtrack(self, event):
        scroll_bar = event.GetEventObject()
        print(scroll_bar.GetThumbPosition())
        event.Skip()

    def button_on_click(self, event):
        print("jump here")
        event.Skip()

也许它相当复杂,目前看起来一团糟。所以我只想要一个尺寸自适应面板,所有小部件也都尺寸自适应,wx.ScrollBar就是其中之一。

这里的问题是:

  1. 当我尝试调整主面板的大小时,这个 wx.ScrollBar 不会改变大小(实际上是垂直长度),但它的位置改变效果很好,所以这真的让我感到困惑。

origanl view

view after resizing

  1. 正如图像所示,子面板(红色背景)也无法正常工作。

我尝试先销毁 wx.ScrollBar 并创建一个新的,现在它可以正常工作...有人知道为什么...?这样可以吗?

python-3.x wxpython
© www.soinside.com 2019 - 2024. All rights reserved.