WrapSize и полоса прокрутки: виджеты, не нарисованные при запуске, не будут рисоваться позже

Используя принятое решение от ScrolledPanel только с вертикальной полосой прокрутки и WrapSizer, вот способ поместить некоторый пользовательский MyControl в WrapSizer с вертикальной 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?

3 ответа

Я попытался использовать sizer в классе MyControl, и все кнопки были отображены:

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, чтобы они заполнили пространство, как вы этого хотите. Это тот тип решения, которое вы искали?


Решение:

Добавьте еще одну панель в Sizer "MyControl".

Вы можете поместить кнопку и текст в эту панель, как вам нравится.

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)


Очень подозрительно использовать оба sizers и явный обработчик wxEVT_SIZE. В принципе, ваш sizer не используется вообще. Удалите обработчик события размера и проверьте, что происходит.

licensed under cc by-sa 3.0 with attribution.