面板内的 ScrolledPanel 未调整大小 [英] ScrolledPanel inside Panel not sizing

查看:31
本文介绍了面板内的 ScrolledPanel 未调整大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经玩了一段时间了,但似乎无法弄清楚.self.panel = wx.Panel(self, wx.ID_ANY)

I've been toying with this for a while and just can't seem to figure it out. self.panel = wx.Panel(self, wx.ID_ANY)

我在不滚动的面板中有一个 scrolledPanel.

I have a scrolledPanel inside a panel that does not scroll.

self.panel = wx.Panel(self, wx.ID_ANY)
self.stepPanel = wxscrollpanel.ScrolledPanel(self.panel, -1, style=wx.EXPAND)
self.stepPanel.SetupScrolling(scrollToTop=False)

sizer = wx.BoxSizer(wx.VERTICAL)
self.stepPanel.SetSizerAndFit(sizer)

更新函数是这样的......

Update function goes like this ...

sizer = self.stepPanel.GetSizer()
# Add some widgets
self.stepPanel.SetSizerAndFit(sizer)

稍后当用户单击按钮时,我将小部件添加到 sizer ......我尝试过自动布局、FitInside()、Update()......当我添加小部件时似乎无法滚动此 stepPanel.

I add widgets to the sizer later on when the user clicks a button ... I've tried auto layout, FitInside(), Update() ... can't seem to scroll this stepPanel when I add widgets.

添加更多信息...

这里的想法是 self.panel 的顶部有一个区域不滚动(只是另一个面板),而下部滚动(self.stepPanel),但似乎 stepPanel 从可视对象中长出来self.panel 的区域

The idea here is that the self.panel has an area at the top that does not scroll (just another panel), while the lower portion scrolls (self.stepPanel), but it appears that the stepPanel grows off of the viewable area of the self.panel

解决见评论.

推荐答案

我想我明白了.像往常一样,在添加或删除小部件时,您需要在父级上调用 Layout,在这种情况下,它是获得新子级的滚动面板.您还必须调用 SetupScrolling() 以便它可以重新计算有多少空间以及它是否需要滚动条.这是一个在 Windows 上适用于我的示例:

I think I figured it out. As usual, when adding or deleting widgets, you need to call Layout on the parent, which in this case is the scrolled panel that is getting new children. You also have to call SetupScrolling() so it can recalculate how much space there is and whether or not it needs scrollbars. Here's an example that works for me on Windows:

import wx
import wx.lib.scrolledpanel as scrolled

########################################################################
class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial", size=(200,500))

        # Add a panel so it looks the correct on all platforms
        self.panel = wx.Panel(self, wx.ID_ANY)

        # --------------------
        # Scrolled panel stuff
        self.scrolled_panel = scrolled.ScrolledPanel(self.panel, -1, 
                                 style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="panel1")
        self.scrolled_panel.SetAutoLayout(1)
        self.scrolled_panel.SetupScrolling()

        words = "A Quick Brown Insane Fox Jumped Over the Fence and Ziplined to Cover".split()
        self.spSizer = wx.BoxSizer(wx.VERTICAL)
        for word in words:
            text = wx.TextCtrl(self.scrolled_panel, value=word)
            self.spSizer.Add(text)
        self.scrolled_panel.SetSizer(self.spSizer)
        # --------------------

        btn = wx.Button(self.panel, label="Add Widget")
        btn.Bind(wx.EVT_BUTTON, self.onAdd)

        panelSizer = wx.BoxSizer(wx.VERTICAL)
        panelSizer.AddSpacer(50)
        panelSizer.Add(self.scrolled_panel, 1, wx.EXPAND)
        panelSizer.Add(btn)
        self.panel.SetSizer(panelSizer)

    #----------------------------------------------------------------------
    def onAdd(self, event):
        """"""
        print "in onAdd"
        new_text = wx.TextCtrl(self.scrolled_panel, value="New Text")
        self.spSizer.Add(new_text)
        self.scrolled_panel.Layout()
        self.scrolled_panel.SetupScrolling()

# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm().Show()
    app.MainLoop()

这篇关于面板内的 ScrolledPanel 未调整大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆