【问题标题】:Add a vertical scrollbar to a wxFrame accross multiple wxPanels跨多个 wxPanel 向 wxFrame 添加垂直滚动条
【发布时间】:2015-08-28 03:09:27
【问题描述】:

我想要一个垂直滚动条贯穿整个框架(顶部块)。我能够获得各个面板的垂直滚动条 -

这里的两个图都是threads 由同一个class 绘制的。

这是在 gnuradio 中设置 top block 的代码 -

class top_block_gui(gr.top_block):
    def __init__(self, title='', size=default_gui_size):
        gr.top_block.__init__(self)
        .............
        self._frame = wx.Frame(None, title=title)
        self._panel = panel.Panel(self._frame)
        .............
    def Run(self, start=True, max_nouts=0):
        #setup app
        self._frame.Bind(wx.EVT_CLOSE, _quit)
        self._sizer = wx.BoxSizer(wx.VERTICAL)
        self._sizer.Add(self._panel, 0, wx.EXPAND)
        self._frame.SetSizerAndFit(self._sizer)
        self._frame.SetAutoLayout(True)
        self._frame.Show(True)
        self._app.SetTopWindow(self._frame)
        #start flow graph
        ..................

Edit 1 - 正如 pssMethod 1 中建议的那样 -

class top_block_gui(gr.top_block):
    def __init__(self, title='', size=default_gui_size):
        gr.top_block.__init__(self)
        .............
        self._frame = wx.Frame(None, title=title)
        self._scroll = wx.ScrolledWindow(self._frame,-1) #Added
        self._scroll.SetScrollbars(1,1,600,400) #Added
        self._panel = panel.Panel(self._scroll) #Changed
        .............
    def Run(self, start=True, max_nouts=0):
        #setup app
        self._frame.Bind(wx.EVT_CLOSE, _quit)
        self._sizer = wx.BoxSizer(wx.VERTICAL)
        self._sizer.Add(self._panel, 0, wx.EXPAND)
        self._scroll.SetSizerAndFit(self._sizer) #Changed
        self._frame.SetAutoLayout(True)
        self._frame.Show(True)
        self._app.SetTopWindow(self._frame)
        #start flow graph
        ..................

但我仍然得到与以前相同的结果。 没有滚动条出现。我是否必须将其 visibility true 设置在某个地方?

【问题讨论】:

  • 也许不是将元素添加到面板本身,而是尝试创建一个sizer,将元素添加到其中,然后在面板上设置这个sizer。
  • 尝试self._panel = wx.lib.scrolledpanel.ScrolledPanel(self._scroll) 也可以尝试手动调整框架大小以查看是否出现滚动条。有时它们仅在框架调整为特定大小或小于该大小时才会出现。
  • 感谢您的帮助。它终于奏效了。我必须在 edit 1 - self._scroll.SetSizer(self._sizer) self._frame.SetAutoLayout(False) 下的代码中更改这些行

标签: python wxpython scrollbar gnuradio


【解决方案1】:

您可以使用以下任意一种方式:

方法一:可以使用wx.ScrolledWindow

示例代码:

import wx
import wx.lib.scrolledpanel

class GUI(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Test app v1.0", style = wx.DEFAULT_FRAME_STYLE )
        self.Center()
        self.CreateStatusBar()
        mainSizer = wx.BoxSizer(wx.VERTICAL)
        self.scroll = wx.ScrolledWindow(self, -1)
        self.scroll.SetScrollbars(1, 1, 600, 400)
        panelA = wx.lib.scrolledpanel.ScrolledPanel(self.scroll, -1, style=wx.SIMPLE_BORDER, size=(300,200))
        panelA.SetupScrolling()
        panelA.SetBackgroundColour('#EEE111')
        panelB = wx.lib.scrolledpanel.ScrolledPanel(self.scroll, -1, style=wx.SIMPLE_BORDER, size=(200,200))
        panelB.SetupScrolling()
        panelB.SetBackgroundColour('#Eaa222')
        mainSizer.Add(panelA, 1, wx.ALL|wx.EXPAND, 5)
        mainSizer.Add(panelB, 1, wx.ALL|wx.EXPAND, 5)
        self.scroll.SetSizer(mainSizer)

if __name__=='__main__':
    app = wx.App(0)
    frame = GUI().Show()
    app.MainLoop()

方法二:可以使用wx.lib.scrolledpanel.ScrolledPanel

例子:

import wx
import wx.lib.scrolledpanel

class GUI(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Test app v1.0", style = wx.DEFAULT_FRAME_STYLE )
        self.Center()
        self.CreateStatusBar()
        mainSizer = wx.BoxSizer(wx.VERTICAL)
        mainPanel = wx.lib.scrolledpanel.ScrolledPanel(self, -1, style=wx.SIMPLE_BORDER, size=(400, 200))
        mainPanel.SetupScrolling()
        mainPanel.SetBackgroundColour('#00000')
        panelA = wx.lib.scrolledpanel.ScrolledPanel(mainPanel, -1, style=wx.SIMPLE_BORDER, size=(300,200))
        panelA.SetupScrolling()
        panelA.SetBackgroundColour('#EEE111')
        panelB = wx.lib.scrolledpanel.ScrolledPanel(mainPanel, -1, style=wx.SIMPLE_BORDER, size=(200,200))
        panelB.SetupScrolling()
        panelB.SetBackgroundColour('#Eaa222')
        mainSizer.Add(panelA, 1, wx.ALL|wx.EXPAND, 5)
        mainSizer.Add(panelB, 1, wx.ALL|wx.EXPAND, 5)
        mainPanel.SetSizer(mainSizer)

if __name__=='__main__':
    app = wx.App(0)
    frame = GUI().Show()
    app.MainLoop()

输出

【讨论】:

    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多