在我的 wxPython 4.1.0 继承自 wx.Frame
,然后从 wx.Panel
,增加一个 ScrolledPanel
除此之外,我还要加上一个 wx.Bitmap
作为子代。该位图图像的高度大于滚动面板的高度,所以垂直滚动条被显示出来--一切都符合预期。
然后我又添加了一个 wx.Panel
下方的滚动面板,没有任何子菜单,但仅此一项就使滚动面板中的滚动条消失了。这是一个bug还是一个功能?
下面是一个完全可行的例子。取消在 def init_panel(self)
来查看奇怪的行为。
import wx
import wx.grid
import wx.lib.intctrl
import wx.lib.scrolledpanel
class TestApp(wx.Frame):
IMAGE_SIZE = 800
SCROLL_SPEED = 10
def __init__(self):
super(TestApp, self).__init__(
None, title="wxPython Test", style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER,
)
self.init_panel()
self.main_panel.Layout()
self.main_panel.Fit()
self.Center()
self.Show()
def init_panel(self):
self.main_panel = wx.Panel(self)
self.main_sizer = wx.BoxSizer(wx.VERTICAL)
self.main_panel.SetSizer(self.main_sizer)
self.bitmaps_panel = wx.lib.scrolledpanel.ScrolledPanel(self.main_panel)
self.bitmaps_panel.SetMinSize((-1, 250))
self.bitmaps_panel.SetupScrolling(scroll_x=False, scroll_y=True, rate_y=self.SCROLL_SPEED)
self.bitmaps_panel.SetAutoLayout(True)
self.bitmaps_sizer = wx.BoxSizer(wx.VERTICAL)
self.bitmaps_panel.SetSizer(self.bitmaps_sizer)
bitmap = wx.Bitmap(wx.Image(self.IMAGE_SIZE, self.IMAGE_SIZE))
self.bitmaps_sizer.Add(wx.StaticBitmap(self.bitmaps_panel, wx.ID_ANY, bitmap))
self.bitmaps_sizer.Fit(self)
self.main_sizer.Add(self.bitmaps_panel, 0, flag=wx.EXPAND)
## With this block commented it works, uncomment to see the scroll bar dissapear
# self.stats_panel = wx.Panel(self)
# self.stats_sizer = wx.BoxSizer(wx.VERTICAL)
# self.stats_panel.SetSizer(self.stats_sizer)
# self.main_sizer.Add(self.stats_panel, 0, flag=wx.EXPAND)
self.main_sizer.Fit(self)
if __name__ == "__main__":
wxapp = wx.App()
app = TestApp()
wxapp.MainLoop()
这个怪异的现象是不是可以通过您创建的 "滚动面板 "来解释。stats_panel
吾辈 self
而不是 self.main_panel
?
import wx
import wx.grid
import wx.lib.intctrl
import wx.lib.scrolledpanel
class TestApp(wx.Frame):
IMAGE_SIZE = 800
SCROLL_SPEED = 10
def __init__(self):
super(TestApp, self).__init__(
None, title="wxPython Test", style=wx.DEFAULT_FRAME_STYLE)
self.init_panel()
self.main_panel.Layout()
self.main_panel.Fit()
self.Center()
self.Show()
def init_panel(self):
self.main_panel = wx.Panel(self)
self.bitmaps_panel = wx.lib.scrolledpanel.ScrolledPanel(self.main_panel)
self.bitmaps_panel.SetMinSize((-1, 250))
self.bitmaps_panel.SetupScrolling(scroll_x=True, scroll_y=True, rate_y=self.SCROLL_SPEED)
self.bitmaps_panel.SetAutoLayout(True)
bitmap = wx.Bitmap(wx.Image(2000, self.IMAGE_SIZE))
self.bitmap = wx.StaticBitmap(self.bitmaps_panel, wx.ID_ANY, bitmap)
self.stats_panel = wx.Panel(self.main_panel)
self.stats_panel.SetBackgroundColour('lightblue')
label = wx.StaticText(self.stats_panel, label="Stats Panel")
self.bitmaps_sizer = wx.BoxSizer(wx.VERTICAL)
self.bitmaps_sizer.Add(self.bitmap, 0, wx.EXPAND, 5)
self.bitmaps_panel.SetSizer(self.bitmaps_sizer)
self.stats_sizer = wx.BoxSizer(wx.VERTICAL)
self.stats_sizer.Add(label)
self.stats_panel.SetSizer(self.stats_sizer)
self.main_sizer = wx.BoxSizer(wx.VERTICAL)
self.main_sizer.Add(self.bitmaps_panel, 0, flag=wx.EXPAND)
self.main_sizer.Add(self.stats_panel, 1, flag=wx.EXPAND)
self.main_panel.SetSizer(self.main_sizer)
if __name__ == "__main__":
wxapp = wx.App()
app = TestApp()
wxapp.MainLoop()