所以我在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就是其中之一。
这里的问题是:
我尝试先销毁 wx.ScrollBar 并创建一个新的,现在它可以正常工作...有人知道为什么...?这样可以吗?