python - 如果在 wxPython 中使用了 ScrolledPanel,如何正确添加另一个面板?
问题描述
在我的wxPython 4.1.0应用程序中,我继承自wx.Frame
,然后从中创建一个主面板wx.Panel
,添加一个ScrolledPanel
并添加一个wx.Bitmap
作为子项。该位图/图像的高度大于滚动面板,因此显示了垂直滚动条 - 一切都符合预期。
然后我在该滚动面板下方添加另一个wx.Panel
,没有任何子项,但仅此一项就使滚动面板中的滚动条消失。这是错误还是功能?
这是一个完整的示例。
取消注释代码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()
推荐阅读
- c# - 如何在 WPF 中显示和绑定数据属性的变量编号(和类型)
- web-services - MSI 安装成功但未安装服务,事件日志中出现 MsiExec 错误
- excel - 更好的做事方式?VBA
- java - 将文件上传到只能通过另一个 SSH/SFTP 服务器访问的 SFTP 服务器
- ios - 我应该在 iPhone X 和 iPhone 8 Plus 中选择哪些@3x 图片
- c++ - C++ 正则表达式从字符串中提取所有可能的 10 位数字
- android - 在用户滑动删除应用程序之前删除文件
- html - 如何在 HTML FlexBox 中将文本与换行符右对齐
- python - 在熊猫分组后选择样本随机组?
- bash - 包装 mysql -e "cmd" 不起作用