python - wxPython:wx.PyControl可以包含wx.Sizer吗?

标签 python wxpython custom-controls widget sizer

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/

相关文章:

python - 当值超过阈值时不同的标记颜色

python - 如何在一个 python 脚本中控制/调用另一个 python 脚本? (脚本之间的通信)

python - 从消息对话框中删除蜂鸣声

python - 将列表传递给函数以充当多个参数

python - 使用 Ipython 调用 pylab 的 GUI 请求无效

python - 如何从 golang 中的单个 protobuf 二进制文件中解码多个指标(流多个)

user-interface - 黑莓 - 字段布​​局动画

winforms - 如何在 WinForms 中制作 ownerdraw Trackbar

HTML5 视频 : hide custom controls when native ones are re-activated

python - 在 `self` 语句中使用 `with` 作为上下文