在wxPython中为ScrolledWindow设置最大宽度

0 投票
1 回答
2713 浏览
提问于 2025-04-15 14:02

我创建了一个框架对象,想要限制它的最大宽度。这个框架里只有一个滚动窗口对象,里面包含了其他所有的子对象。我有很多对象是垂直排列的,所以这个滚动窗口变得很高。通常右边会有一个滚动条,方便你上下滚动。

问题出现在我尝试为框架设置最大尺寸的时候。我使用了 scrolled_window.GetBestSize()(或者 scrolled_window.GetEffectiveMinSize())这两个函数,但它们没有考虑到垂直滚动条的宽度。结果框架的宽度总是稍微窄了一点,导致总是出现一个横向滚动条,怎么也消不掉。

有没有什么方法可以计算出垂直滚动条的宽度?如果没有,我该如何获取滚动条的宽度,以便手动把它加到框架的最大尺寸里呢?

这里有一个例子,展示了一个高但窄的框架:

class TallFrame(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self, parent=None, title='Tall Frame')
    self.scroll = wx.ScrolledWindow(parent=self) # our scroll area where we'll put everything
    scroll_sizer = wx.BoxSizer(wx.VERTICAL)

    # Fill the scroll area with something...
    for i in xrange(10):
      textbox = wx.StaticText(self.scroll, -1, "%d) Some random text" % i, size=(400, 100))
      scroll_sizer.Add(textbox, 0, wx.EXPAND)
    self.scroll.SetSizer(scroll_sizer)
    self.scroll.Fit()

    width, height = self.scroll.GetBestSize()
    self.SetMaxSize((width, -1)) # Trying to limit the width of our frame
    self.scroll.SetScrollbars(1, 1, width, height) # throwing up some scrollbars

如果你创建这个框架,你会发现 self.SetMaxSize 设置得太窄了。由于 self.scroll.GetBestSize() 没有考虑到滚动条的宽度,所以总会出现一个横向滚动条。

1 个回答

1

这个方法有点儿丑,但在Windows和Linux上都能用。不过,它们之间还是有些区别的。self.GetVirtualSize()在不同的平台上返回的值似乎不一样。无论如何,我觉得这可能对你有帮助。

width, height = self.scroll.GetBestSize()
width_2, height_2 = self.GetVirtualSize()
print width
print width_2
dx = wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X)
print dx
self.SetMaxSize((width + (width - width_2) + dx, -1)) # Trying to limit the width of our frame
self.scroll.SetScrollbars(1, 1, width, height) # throwing up some scrollbars

撰写回答