wxPython:wx.py控件能否包含wx.Sizer?

wxPython:wx.py控件能否包含wx.Sizer?,python,wxpython,custom-controls,widget,sizer,Python,Wxpython,Custom Controls,Widget,Sizer,wx.PyControl是否可以包含wx.Sizer 请注意,我在这里最终要做的(带有浮点值的微调器)已经在另一个问题中得到了回答。我特别感兴趣的是在wx.PyControl中布局小部件,如果我需要制作自己的自定义小部件,这项技能可能会很有用。我已经通读了一遍,但是它没有在wx.PyControl子类中使用sizer 使用下面的代码,我的CustomWidget看起来不对劲。我还没有做DoGetBestSize,因为我认为这适用于wx.Sizer在小部件上执行。实际上,我有一个wx.Sizer在

wx.PyControl
是否可以包含
wx.Sizer

请注意,我在这里最终要做的(带有浮点值的微调器)已经在另一个问题中得到了回答。我特别感兴趣的是在
wx.PyControl
中布局小部件,如果我需要制作自己的自定义小部件,这项技能可能会很有用。我已经通读了一遍,但是它没有在
wx.PyControl
子类中使用sizer

使用下面的代码,我的
CustomWidget
看起来不对劲。我还没有做
DoGetBestSize
,因为我认为这适用于
wx.Sizer
在小部件上执行。实际上,我有一个
wx.Sizer
CustomWidget
中做它的事情

下面是我的代码(没有子窗口小部件之间的事件绑定):
编辑:这是我更正的课程代码,感谢:


是的,它可以。您只需要调用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派生的类通常不用于包含其他小部件,自动布局代码不存在,因此当它获得EVT_SIZE事件时,它不会调用layout()。通过为EVT_SIZE绑定一个处理程序并从中调用self.Layout(),可以轻松地将该功能添加到类中。然后,它将像一个面板一样,获得大小事件,并有子项和大小器。

这太棒了!感谢社区提供的关于runnable示例的提示。下次我会这样做:)我还编辑了我的问题以包含你的解决方案。我用这个做了一些实验,但我认为当
CustomWidget
wx.Panel
的子对象而不是
wx.Frame
时,它会崩溃。你的想法?你按照罗宾的建议试过了吗?是的,我也试过了。我写了一篇文章
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()