如何覆盖面板的最小大小?

2024-05-15 20:54:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图实现一个panel子类,当内容溢出其垂直边界时,它将自动插入垂直滚动条。我希望面板的工作方式与普通面板完全相同,但有一点除外:面板的最小高度不是其大小调整器的最小高度,而是应该有一个静态值(如200),当面板的高度低于其大小调整器的高度时,应该出现一个垂直滚动条。换言之,当面板的高度比sizer的最小高度高时,它的功能应该与普通面板完全相同。在

我遇到的问题是,重写面板上的DoGetBestSize和{}之类的函数没有效果,因为这些函数永远不会被调用(我通过插入断点来检查)。我猜面板的父级与面板的sizer直接通信,在本例中,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,这些函数仍然不会被调用。我试过PanelPyPanel。这是我当前的滚动面板:

^{pr2}$

Tags: the函数selfdefault面板高度initdef
3条回答

你不需要做什么特别的事。如果您对任何wxWindow,包括wxPanel调用SetVirtualSize(),它将根据需要显示滚动条,大小调整器将使用虚拟大小来显示此窗口内容。在

你为什么要重新发明轮子?wxPython提供了一个滚动面板小部件: wx.lib.滚动面板在

你应该用这个。wxPython演示有一个例子。在

编辑:下面是一个示例脚本,在大小写器中有一个滚动面板。

import wx
import  wx.lib.scrolledpanel as scrolled

########################################################################
class MyScrolledPanel(scrolled.ScrolledPanel):
    """"""

    #                                   
    def __init__(self, parent):
        """Constructor"""
        scrolled.ScrolledPanel.__init__(self, parent)


########################################################################
class MainPanel(wx.Panel):
    """"""

    #                                   
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        text = "one two buckle my shoe three four shut the door five six pick up sticks seven eight lay them straight nine ten big fat hen"

        mainSizer = wx.BoxSizer(wx.VERTICAL)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sPanel = MyScrolledPanel(self)

        words = text.split()
        for word in words:
            hSizer = wx.BoxSizer(wx.HORIZONTAL)
            label = wx.StaticText(sPanel, -1, word+":")
            tc = wx.TextCtrl(sPanel, -1, word, size=(50,-1))

            hSizer.Add(label, flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=10)
            hSizer.Add(tc, flag=wx.LEFT, border=10)
            sizer.Add(hSizer)

        sPanel.SetSizer(sizer)
        sPanel.SetAutoLayout(1)
        sPanel.SetupScrolling()

        mainSizer.Add(sPanel, 1, wx.EXPAND)
        self.SetSizer(mainSizer)


########################################################################
class MainFrame(wx.Frame):
    """"""

    #                                   
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None)
        panel = MainPanel(self)

if __name__ == "__main__":
    app = wx.App(False)
    frame = MainFrame()
    frame.Show()
    app.MainLoop()

在WxPython中重写方法当前需要使用基类,这些基类被设计为将某些C++调用的调用反映到Python中重写的方法中。这意味着如果你想在一个面板中捕捉那些你需要从中派生类的元素wx.PyPanel面板而不是wx.面板. 见http://wiki.wxpython.org/OverridingMethods

相关问题 更多 >