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()
800   2  

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

    Ничего не найдено.