通过使用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
中的所有项目?
答案 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)