如何使滚动条出现在没有小部件但只有一条直线的 wx.lib.scrolledpanel.ScrolledPanel 中?
How to make scrollbars appear in a wx.lib.scrolledpanel.ScrolledPanel which has no widgets but only a straight line?
我创建了一个 wx.lib.scrolledpanel.ScrolledPanel。我将它插入垂直框尺寸器内的父面板中。父面板的尺寸为 width=500, height=500.
然后,在 ScrolledPanel 中,我画了一条高度为 1000 的垂直线。
当我 运行 应用程序时,滚动条不显示在 ScrolledPanel 上。我只看到高度为 500 的垂直线,因为父面板的高度为 500。
滚动面板或父面板中没有小部件。
为什么没有出现垂直滚动条,以便我可以向下滚动并看到该垂直线的其余部分?我如何让它出现?
我什至尝试在绘制垂直线后将 ScrolledPanel 的高度设置为 1000,但它也不起作用,例如:
这行不通:
create_parent_panel_with_height_500()
create_scrolled_panel()
put_scrolled_panel_on_parent_panel_and_set_sizer()
push_a_button_to_draw_the_vertical_line_with_height_1000()
update_and_refresh_scrolled_panel()
这也不行:
create_parent_panel_with_height_500()
create_scrolled_panel()
put_scrolled_panel_on_parent_panel_and_set_sizer()
push_a_button_to_draw_the_vertical_line_with_height_1000()
set_scrolled_panels_height_to_1000()
update_and_refresh_scrolled_panel()
在这两种方法中,绘制垂直线后都不会出现滚动条。
由于您没有粘贴任何 'real' 代码,因此很难知道您做错了什么。
也许这会有所帮助:
#!/bin/env python
import wx
import wx.lib.scrolledpanel as SP
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, - 1, "Frame", size=(300, 300))
panel = wx.Panel(self, - 1)
self.scrolledPanel = AScrollPanel(panel)
panel.Show()
class AScrollPanel(SP.ScrolledPanel):
def __init__(self, parent):
SP.ScrolledPanel.__init__(self, parent, -1, size=(200, 100))
self.parent = parent
self.Sizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(self.Sizer)
self.SetupScrolling(scroll_x=True, scroll_y=True, scrollToTop=False)
self.ATop = wx.StaticText(self, -1, "Top of Line")
self.ALine = wx.StaticLine(self, -1, size=(30,1000),style=wx.LI_VERTICAL)
self.ABottom = wx.StaticText(self, -1, "Bottom of Line")
self.Sizer.Add(self.ATop)
self.Sizer.Add(self.ALine)
self.Sizer.Add(self.ABottom)
self.Layout()
if __name__ == '__main__':
app = wx.App()
frame = MyFrame()
frame.Show(True)
app.MainLoop()
由于面板上没有任何小部件,因此 ScrolledPanel
不是最佳选择,因为它基于 window 的虚拟和物理大小 space sizer 需要。使用 wx.ScrolledWindow
会是更好的选择,因为您可以自己控制虚拟大小。
如果您出于某种原因无法使用 ScrolledPanel
,它仍然可行。您应该只需要创建一个 sizer,并向其添加一个 spacer 为您的绘图保留足够的 space,然后将 sizer 分配给面板。 ScrolledPanel
中有一些代码期望至少有一个接受焦点的子小部件,但如果有任何问题,这可能会在派生的 class 中处理。
我创建了一个 wx.lib.scrolledpanel.ScrolledPanel。我将它插入垂直框尺寸器内的父面板中。父面板的尺寸为 width=500, height=500.
然后,在 ScrolledPanel 中,我画了一条高度为 1000 的垂直线。 当我 运行 应用程序时,滚动条不显示在 ScrolledPanel 上。我只看到高度为 500 的垂直线,因为父面板的高度为 500。 滚动面板或父面板中没有小部件。
为什么没有出现垂直滚动条,以便我可以向下滚动并看到该垂直线的其余部分?我如何让它出现?
我什至尝试在绘制垂直线后将 ScrolledPanel 的高度设置为 1000,但它也不起作用,例如:
这行不通:
create_parent_panel_with_height_500()
create_scrolled_panel()
put_scrolled_panel_on_parent_panel_and_set_sizer()
push_a_button_to_draw_the_vertical_line_with_height_1000()
update_and_refresh_scrolled_panel()
这也不行:
create_parent_panel_with_height_500()
create_scrolled_panel()
put_scrolled_panel_on_parent_panel_and_set_sizer()
push_a_button_to_draw_the_vertical_line_with_height_1000()
set_scrolled_panels_height_to_1000()
update_and_refresh_scrolled_panel()
在这两种方法中,绘制垂直线后都不会出现滚动条。
由于您没有粘贴任何 'real' 代码,因此很难知道您做错了什么。
也许这会有所帮助:
#!/bin/env python
import wx
import wx.lib.scrolledpanel as SP
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, - 1, "Frame", size=(300, 300))
panel = wx.Panel(self, - 1)
self.scrolledPanel = AScrollPanel(panel)
panel.Show()
class AScrollPanel(SP.ScrolledPanel):
def __init__(self, parent):
SP.ScrolledPanel.__init__(self, parent, -1, size=(200, 100))
self.parent = parent
self.Sizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(self.Sizer)
self.SetupScrolling(scroll_x=True, scroll_y=True, scrollToTop=False)
self.ATop = wx.StaticText(self, -1, "Top of Line")
self.ALine = wx.StaticLine(self, -1, size=(30,1000),style=wx.LI_VERTICAL)
self.ABottom = wx.StaticText(self, -1, "Bottom of Line")
self.Sizer.Add(self.ATop)
self.Sizer.Add(self.ALine)
self.Sizer.Add(self.ABottom)
self.Layout()
if __name__ == '__main__':
app = wx.App()
frame = MyFrame()
frame.Show(True)
app.MainLoop()
由于面板上没有任何小部件,因此 ScrolledPanel
不是最佳选择,因为它基于 window 的虚拟和物理大小 space sizer 需要。使用 wx.ScrolledWindow
会是更好的选择,因为您可以自己控制虚拟大小。
如果您出于某种原因无法使用 ScrolledPanel
,它仍然可行。您应该只需要创建一个 sizer,并向其添加一个 spacer 为您的绘图保留足够的 space,然后将 sizer 分配给面板。 ScrolledPanel
中有一些代码期望至少有一个接受焦点的子小部件,但如果有任何问题,这可能会在派生的 class 中处理。