【问题标题】:wxPython scrolled panel scroll bar sizing issuewxPython滚动面板滚动条大小问题
【发布时间】:2013-07-15 21:17:00
【问题描述】:

我目前正在构建的 GUI 存在问题。我的应用程序目前由两个并排的笔记本构成,下面有一个终端/日志 textCtrl。左侧笔记本包含各种输入和输出面板,右侧笔记本包含一个或多个 matplotlib 图形。

问题在于,在左侧笔记本中,我有一个页面,它由垂直堆叠的 3 个面板组成。前两个具有标准控件(复选框、文本控件和组合框)。在这些“设置”下方是一个 wx.grid.Grid,其中包含用于在右侧 mpl 图中绘制的一些参数的 I/O。这个网格可以变得很大,所以我把它放到一个滚动面板中。在 Windows 中一切正常,但在 linux 上,我发现 y_scroll 条高于可见面板的高度(这样滚动条的下半部分未显示)——如果有道理的话。

我整理了一个有类似问题的小代码 - 滚动条与实际面板的高度不同。我做错了什么?

import wx
import wx.grid as grd
import wx.lib.scrolledpanel as scrolled



# A sample panel with some check box controls to take up space, within a
# static box sizer
class SamplePanel(wx.Panel):
    def __init__(self,parent):
        wx.Panel.__init__(self,parent)

        grid = wx.GridBagSizer()
        for i in (0,1):
            grid.Add(wx.StaticText(self,label="Blah Blah: "),pos=(i,0))
            grid.Add(wx.CheckBox(self),pos=(i,1))

        box = wx.StaticBox(self, -1, "Some Settings: ")
        box_sizer = wx.StaticBoxSizer(box,wx.VERTICAL)
        box_sizer.Add(grid, 0, wx.ALL)
        self.SetSizer(box_sizer)
        self.Layout()


# A sample "table" of some parameters, let's say
class SampleGrid(grd.Grid):
    def __init__(self,parent):
        grd.Grid.__init__(self,parent)

        self.CreateGrid(20,4)
        self.SetColLabelValue(0,"Value")
        self.SetColLabelValue(1,"Lo-Bound")
        self.SetColLabelValue(2,"Hi-Bound")
        self.SetColLabelValue(3,"Fit")



# The main panel:        
class AnotherPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self,parent)

        # main sizer for everything:
        mainSizer = wx.BoxSizer(wx.VERTICAL)

        # Add a few "sample panels":
        mainSizer.Add(SamplePanel(self),0,wx.CENTER)
        mainSizer.Add(SamplePanel(self),0,wx.CENTER)
        mainSizer.Add(SamplePanel(self),0,wx.CENTER)

        # Create the grid which will be scrollable:
        scrolledPanel = scrolled.ScrolledPanel(self, size=(425,400))
        table = SampleGrid(scrolledPanel)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(table,1,wx.ALL|wx.EXPAND,5)
        scrolledPanel.SetSizer(sizer)
        scrolledPanel.Layout()
        scrolledPanel.SetupScrolling(scroll_x=False)

        # Put the scrolled panel into a static box:
        box = wx.StaticBox(self,-1,"Parameters: ")
        sizer2 = wx.StaticBoxSizer(box,wx.VERTICAL)
        sizer2.Add(scrolledPanel,1,wx.EXPAND)

        mainSizer.Add(sizer2,1,wx.EXPAND)
        self.SetSizer(mainSizer)
        self.Fit()


# The main frame:
class MainFrame(wx.Frame):
    def __init__(self,parent,title):
        wx.Frame.__init__(self,parent,-1,title=title, size=(850,500))

        # Put 2 panels side by side:        
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(AnotherPanel(self),1,wx.EXPAND)
        sizer.Add(AnotherPanel(self),1,wx.EXPAND)

        self.SetSizer(sizer)
        self.SetAutoLayout(1)


# And, the app and mainloop:
app = wx.App(False)
frame = MainFrame(None, "Scroll Test")
frame.Show(True)
app.MainLoop()

提前感谢您的帮助!这也是我第一次发帖,所以我提前为任何失礼道歉——我尽量避免任何失礼!!! ;)

编辑代码中的一些拼写错误,现在应该可以正常运行了

edit 2 在 windows 和 linux 上我都有 Python 2.7.3(尽管 Canopy 发行版)和 wxPython 2.8.10.1。

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

    只需删除 scrolledPanel 实例的硬编码大小:

    scrolledPanel = scrolled.ScrolledPanel(self)
    

    这对我在 CentOS 上使用 wxPython 2.8.12 和 Python 2.6.6 有效

    【讨论】:

    • 谢谢 - 是的,这在这个测试仪中确实有效。但是,在我的实际应用程序中,当我删除它时,我得到一个比网格中一个单元格的高度短的滚动面板 - 因此实际上什么都无法显示。如何设置滚动面板的大小,而不会遇到滚动条的问题?
    • 您是否像在此示例中一样将滚动面板添加到大小调整器?因为它听起来好像没有展开或者比例没有设置为 1。如果调整框架大小,它是否会捕捉到正确的大小?
    • 是的,我正在做几乎完全相同的事情 - 不幸的是,涉及更多“层”,因此我发布的示例已大大简化。调整大小不会影响它。 :(
    • 仍然没有找到一个很好的解决方案,但是让它工作的一种方法是一起移除滚动面板。网格本身具有滚动功能,可以直接放入面板中。这在一定程度上解决了我的“全面”实施中的问题。
    猜你喜欢
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多