wxPython: проблема макета wx.PyControl, когда он является дочерним элементом wx.Panel - PullRequest
0 голосов
/ 22 июля 2010

Это продолжение этого вопроса:
wxPython: может ли wx.PyControl содержать wx.Sizer?

Основной темой здесь является использование wx.Sizer внутриwx.PyControl.У меня были проблемы Fit(), связывающие мои CustomWidget с дочерними виджетами.Эта проблема была решена путем вызова Layout() после Fit().

Однако , насколько я знаю, решение работает только тогда, когда CustomWidget является прямым потомкомwx.Frame.Он ломается, когда становится дочерним по отношению к wx.Panel.

РЕДАКТИРОВАТЬ: Используя приведенный ниже код, CustomWidget не может правильно изменить размер, чтобы соответствовать его дочерним элементам.Я заметил, что это происходит только тогда, когда CustomWidget (как подкласс wx.PyControl) является потомком wx.Panel;в противном случае, если он является прямым потомком wx.Frame, он Fit() с отлично.

Вот код:

import wx

class Frame(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self, parent=None)
    panel = Panel(parent=self)
    custom = CustomWidget(parent=panel)
    self.Show()

class Panel(wx.Panel):
  def __init__(self, parent):
    wx.Panel.__init__(self, parent=parent)
    self.SetSize(parent.GetClientSize())

class CustomWidget(wx.PyControl):
  def __init__(self, parent):
    wx.PyControl.__init__(self, parent=parent)

    # Create the sizer and make it work for the CustomWidget        
    sizer = wx.GridBagSizer()
    self.SetSizer(sizer)

    # Create the CustomWidget's children
    text = wx.TextCtrl(parent=self)
    spin = wx.SpinButton(parent=self, style=wx.SP_VERTICAL)

    # Add the children to the sizer        
    sizer.Add(text, pos=(0, 0), flag=wx.ALIGN_CENTER)
    sizer.Add(spin, pos=(0, 1), flag=wx.ALIGN_CENTER)

    # Make sure that CustomWidget will auto-Layout() upon resize
    self.Bind(wx.EVT_SIZE, self.OnSize)
    self.Fit()

  def OnSize(self, event):
    self.Layout()

app = wx.App(False)
frame = Frame()
app.MainLoop()

1 Ответ

1 голос
/ 23 июля 2010

.SetSizerAndFit(sizer) делает работу. Я не уверен, почему .SetSizer(sizer) тогда .Fit() не будет работать. Есть идеи?

import wx

class Frame(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self, parent=None)
    panel = Panel(parent=self)
    custom = CustomWidget(parent=panel)
    self.Show()

class Panel(wx.Panel):
  def __init__(self, parent):
    wx.Panel.__init__(self, parent=parent)
    self.SetSize(parent.GetClientSize())

class CustomWidget(wx.PyControl):
  def __init__(self, parent):
    wx.PyControl.__init__(self, parent=parent)

    # Create the sizer and make it work for the CustomWidget        
    sizer = wx.GridBagSizer()
    self.SetSizer(sizer)

    # Create the CustomWidget's children
    text = wx.TextCtrl(parent=self)
    spin = wx.SpinButton(parent=self, style=wx.SP_VERTICAL)

    # Add the children to the sizer        
    sizer.Add(text, pos=(0, 0), flag=wx.ALIGN_CENTER)
    sizer.Add(spin, pos=(0, 1), flag=wx.ALIGN_CENTER)

    # Set sizer and fit, then layout
    self.SetSizerAndFit(sizer)
    self.Layout()

  # ------------------------------------------------------------
  #  # Make sure that CustomWidget will auto-Layout() upon resize
  #  self.Bind(wx.EVT_SIZE, self.OnSize)
  #  self.Fit()
  #  
  #def OnSize(self, event):
  #  self.Layout()
  # ------------------------------------------------------------    

app = wx.App(False)
frame = Frame()
app.MainLoop()
...