WrapSize和Scrollbar:未在启动时绘制的小部件将不会在以后绘制

时间:2014-01-29 17:54:17

标签: python wxpython wxwidgets

通过使用ScrolledPanel with vertical scrollbar only and WrapSizer中接受的解决方案,可以使用垂直滚动条将一些自定义MyControl放入WrapSizer

不幸的是,即使在移动滚动条之后,启动时未绘制的项目也不会在以后绘制。这里只绘制了前9个按钮(20个):

import wx
import wx.lib.scrolledpanel as scrolled

class MyControl(wx.PyControl):
    def __init__(self, parent, i):
        wx.PyControl.__init__(self, parent, wx.ID_ANY, wx.DefaultPosition, size=(100,100)) 
        wx.Button(self, wx.ID_ANY, "btn %d" % i, (0,0), (50,50), 0)
        # some other things here 

class MyPanel(scrolled.ScrolledPanel):
    def __init__(self, parent):
        scrolled.ScrolledPanel.__init__(self, parent, style=wx.VSCROLL)
        self.sizer = wx.WrapSizer()
        self.SetupScrolling(scroll_x = False)
        for i in range(1, 20):
            btn = MyControl(self, i)
            self.sizer.Add(btn, 0, wx.ALL, 10)
        self.SetSizer(self.sizer)
        self.Bind(wx.EVT_SIZE, self.onSize)

    def onSize(self, evt):
        size = self.GetSize()
        vsize = self.GetVirtualSize()
        self.SetVirtualSize((size[0], vsize[1]))        

app = wx.App(redirect=False)
frame = wx.Frame(None, size=(400,400))
MyPanel(frame)
frame.Show()
app.MainLoop()

如何正确绘制WrapSizer中的所有项目?


enter image description here

3 个答案:

答案 0 :(得分:1)

使用sizer和显式wxEVT_SIZE处理程序非常可疑。基本上,您的sizer根本不使用。删除你的大小事件处理程序并检查会发生什么。

答案 1 :(得分:1)

我尝试在MyControl类中使用sizer并显示所有按钮:

class MyControl(wx.PyControl):
    def __init__(self, parent, i):
    wx.PyControl.__init__(self, parent, wx.ID_ANY, wx.DefaultPosition, size=(100,100))

    # Just saving the button in a variable
    btn = wx.Button(self, wx.ID_ANY, "btn %d" % i, (0,0), (50,50), 0)

    # Creating sizer and placing the button in sizer
    sizer = wx.BoxSizer()
    sizer.Add(btn)
    self.SetSizer(sizer)

你可以搞乱sizer参数,让它们填满你想要的空间。 这是您正在寻找的解决方案类型吗?

答案 2 :(得分:1)

解决方案:

将另一个面板添加到“MyControl”的 Sizer 中。

您可以根据需要将按钮和文本放入此面板。

class MyControl(wx.PyControl):
    def __init__(self, parent, i):
        wx.PyControl.__init__(self, parent, wx.ID_ANY, wx.DefaultPosition, size=(100,100))

        panel = wx.Panel(self)
        btn  =  wx.Button(panel, wx.ID_ANY, "btn %d" % i, (0,0), (50,50), 0)
        txt1 = wx.StaticText(panel, -1, 'blah', (50,50))
        txt2 = wx.StaticText(panel, -1, 'blah2', (50,80))
        sizer = wx.BoxSizer()
        sizer.Add(panel)
        self.SetSizer(sizer)