wxPython: можно wx.PyControl содержат wx.Сайзер?
Может wx.PyControl содержит wx.Sizer?
Обратите внимание, что то, что я в конечном счете пытаюсь сделать здесь (спиннер с плавающими значениями), уже ответили в другом вопросе. Я особенно заинтересован в размещении виджетов внутри
wx.PyControl, навык, который может оказаться полезным, если я столкнусь с необходимостью сделать свои собственные виджеты. Я уже прочитал CreatingCustomControls, но он не использовал сайзеры в подклассе wx.PyControl.Используя мой код ниже, мой CustomWidget просто не выглядит право. Я еще не делаю DoGetBestSize, потому что я думаю, что это применимо к wx.Sizer, действующему на виджете. На самом деле у меня есть wx.Sizer, делающий свое дело внутри a CustomWidget.
Вот мой код (без привязки событий между суб-виджетами):
EDIT: Вот мой исправленный код класса, благодаря Steven Sproat :
import wx
class CustomWidget(wx.PyControl):
def __init__(self, parent):
wx.PyControl.__init__(self, parent=parent, style=wx.NO_BORDER) # Style added.
text = wx.TextCtrl(parent=self)
spin = wx.SpinButton(parent=self, style=wx.SP_VERTICAL)
sizer = wx.GridBagSizer()
self.layout(text, spin, sizer)
self.OnInit(text, sizer)
def OnInit(self, text, sizer):
text.SetValue(u"0.000")
def layout(self, text, spin, sizer):
self.SetSizer(sizer)
sizer.Add(text, pos=(0, 0), flag=wx.ALIGN_CENTER)
sizer.Add(spin, pos=(0, 1), flag=wx.ALIGN_CENTER)
self.Fit()
self.Layout() # This is what I lacked. I needed to call .Layout()
self.CenterOnParent()
2 ответов:
Да, может. Вам просто нужно вызвать Layout (), чтобы сказать sizer пересчитать/разметить его дочерние элементы.
import wx class Frame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None) blah = CustomWidget(self) self.Show(True) class CustomWidget(wx.PyControl): def __init__(self, parent): wx.PyControl.__init__(self, parent=parent) text = wx.TextCtrl(parent=self) spin = wx.SpinButton(parent=self, style=wx.SP_VERTICAL) sizer = wx.GridBagSizer() self.layout(text, spin, sizer) self.OnInit(text, sizer) def OnInit(self, text, sizer): text.SetValue(u"0.000") def layout(self, text, spin, sizer): self.SetSizer(sizer) sizer.Add(text, pos=(0, 0), flag=wx.ALIGN_CENTER) sizer.Add(spin, pos=(0, 1), flag=wx.ALIGN_CENTER) self.Fit() self.Layout() self.CenterOnParent() app = wx.App() f = Frame() app.MainLoop()Кстати, было бы неплохо в будущем, если бы вы могли прикрепить запускаемый образец, как указано выше:)
Поскольку классы, производные от wxControl, обычно не используются для хранения других виджетов, код автоматической компоновки отсутствует, и поэтому он не будет вызывать Layout() при получении события EVT_SIZE. Вы можете легко добавить эту способность в свой класс, связав()обработчик для EVT_SIZE и вызывая self.Layout() оттуда. Тогда он будет действовать так же, как панель, когда она получает событие размера и имеет детей и sizer.
Comments