wx.PyControl
可以包含wx.Sizer
吗?
请注意,我最终想要在这里做的事情(具有浮点值的旋转器)已经在另一个问题中得到了回答。我对在 wx.PyControl
中布局小部件特别感兴趣,如果我需要制作自己的自定义小部件,这项技能可能会很有用。我已经读过 CreatingCustomControls ,但它没有在 wx.PyControl
子类中使用 sizer。
使用下面的代码,我的 CustomWidget
看起来不正确。我还没有做 DoGetBestSize
因为我认为这适用于 作用于小部件的 wx.Sizer
。我实际上有一个wx.Sizer
在内部做它的事情CustomWidget
。
这是我的代码(没有子小部件之间的事件绑定(bind)):
编辑:这是我更正后的类代码,感谢 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()
最佳答案
是的,可以。您只需要调用 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()
顺便说一句,如果您能像上面那样附加一个可运行的示例,那就太好了:)
关于python - wxPython:wx.PyControl可以包含wx.Sizer吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3271639/