2

a 可以wx.PyControl包含 awx.Sizer吗?

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

使用下面的代码,我的CustomWidget只是看起来不正确。我还没有做,因为DoGetBestSize我认为这适用于小部件的操作。我实际上正在做它的事情wx.Sizerwx.SizerCustomWidget

这是我的代码(没有子小部件之间的事件绑定):
编辑:这是我更正的类代码,感谢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()
4

2 回答 2

3

是的,它可以。您只需要调用 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()

顺便说一句,如果你能像上面那样附加一个可运行的样本,那将来会很好:)

于 2010-07-17T16:46:37.540 回答
1

由于从 wxControl 派生的类通常不用于包含其他小部件,因此不存在自动布局代码,因此它在收到 EVT_SIZE 事件时不会调用 Layout()。您可以通过 Bind() 处理 EVT_SIZE 的处理程序并从那里调用 self.Layout() 轻松地将该功能添加到您的类中。然后它会像面板一样在获得 size 事件并具有子项和 sizer 时发挥作用。

于 2010-07-19T16:12:01.757 回答