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