【发布时间】:2013-01-28 09:36:45
【问题描述】:
我正在尝试实现一个面板子类,如果内容超出其垂直边界,它将自动插入垂直滚动条。我希望面板在各个方面都完全像普通面板一样工作,但有一个:面板的最小高度不是其尺寸器的最小高度,它应该有一个静态值(如 200) ,并且当面板的高度低于其大小的高度时,应该会出现一个垂直滚动条。换句话说,当面板的高度高于尺寸器的最小高度时,它的功能应该与普通面板完全一样。
我遇到的问题是面板上的DoGetBestSize 和GetMinSize 之类的覆盖函数没有任何效果,因为这些函数从未被调用(我通过插入断点进行了检查)。我猜面板的父级直接与面板的 sizer 通信,在这种情况下,它是从面板外部设置的普通 box sizer。
class ScrolledPanel(wx.Panel):
"""A panel that will automatically add scrollbars when needed."""
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)
self.SetBackgroundColour('#FF0000')
# This function is never called.
def DoGetBestSize(self):
"""Override the minimum size of the panel."""
default = self.GetSizer().GetMinSize()
default.SetHeight(250)
return default
能达到我想要的效果吗?如果是这样,我该如何规避上述问题?
Here is the code in which I'm trying to use the scrolled panel.
更新
我想我会尝试覆盖SetSizer 函数,将那个sizer 作为人质并咨询它的大小,但实际上并没有在面板上设置sizer。这样会调用像DoGetBestSize 这样的自定义大小函数。虽然失败了。即使没有设置 sizer,这些函数仍然不会被调用。我试过Panel 和PyPanel。这是我当前的滚动面板:
class ScrolledPanel(wx.PyPanel):
"""A panel that will automatically add scrollbars when needed."""
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)
self.SetBackgroundColour('#FF0000')
# This function is called.
def SetSizer(self, sizer):
import pdb; pdb.set_trace()
self._pet_sizer = sizer
# The below functions are never called.
def DoGetBestSize(self):
"""Override the minimum size of the panel."""
import pdb; pdb.set_trace()
default = self.GetSizer().GetMinSize()
default.SetHeight(250)
return default
def DoGetClientSize(self):
import pdb; pdb.set_trace()
def DoGetSize(self):
import pdb; pdb.set_trace()
def DoGetVirtualSize(self):
import pdb; pdb.set_trace()
【问题讨论】: