wxPython:具有浮点值的“超级”wx.SpinCtrl,sizer内部的布局

时间:2010-07-16 01:36:14

标签: python wxpython spinner sizer

wx.SpinCtrl仅限于整数旋转,而不是浮动。因此,我正在构建一个wx.TextCtrl + wx.SpinButton组合类,这使我能够跨越浮点数。我能够以编程方式对它们进行大小和布局,以使组合看起来与普通wx.SpinCtrl完全相同。

我从wx.TextCtrl继承了这个组合,因为我希望它的父面板能够捕获wx.EVT_TEXT个事件。如果你能改进我的这个论点,我将不胜感激。

来自wx.EVT_SPIN_UP的{​​{1}}和wx.EVT_SPIN_DOWN事件都是内部实现,而父框架并不关心这些事件。

现在,我刚碰到一堵砖墙。我的组合类与sizer不兼容。将{2}组合课程wx.SpinButton移至.Add()后,wx.GridBagSizer内只会列出wx.TextCtrlwx.GridBagSizer本身就是独立的。但wx.SpinButton绑定工作得非常好。

我的问题是布局。如果我希望wx.EVT_SPIN*将其视为一个小部件,我该如何编写该类?

这是我的组合类代码:

wx.GridBagSizer

2 个答案:

答案 0 :(得分:3)

如果你想控制你,你需要覆盖DoGetBestSize() 由sizer正确管理。看看CreatingCustomControls

您还可以查看wxPython附带的FloatSpin (在wx.lib.agw中)从版本2.8.9.2开始。

回应你的意见:

  • 实现DoGetBestSize()不需要直接绘制位图。您只需要找到一种方法,如何确定新窗口小部件的最佳尺寸。通常你只是使用 两个小部件的大小由(text + spinner)组成。
  • 要让sizer将两个小部件视为一个,您可以将它们放在另一个大小调整器中。
  • 使用wxPython实现自定义窗口小部件的推荐方法是从wx.PyControl派生新窗口小部件,向其添加一个sizer并添加要与该sizer组合的两个窗口小部件。

答案 1 :(得分:1)

正如Kit的评论中所提到的,FloatSpin现在已经成为可能。

它已集成在最新版本中。

以下是一个简单的用法示例:

import wx
from wx.lib.agw.floatspin import FloatSpin

class Example_FloatSpin(wx.Frame):
    def __init__(self, parent, title):
        super(Example_FloatSpin, self).__init__(parent, title=title, size=(480, 250))
        panel = wx.Panel(self)

        vbox = wx.BoxSizer(wx.VERTICAL)
        spin = FloatSpin(panel, value=0.0, min_val=0.0, max_val=8.0, increment=0.5, digits=2, size=(100,-1))
        vbox.Add(spin, proportion=0, flag=wx.CENTER, border=15)
        panel.SetSizer(vbox)

        self.Centre()
        self.Show() 


if __name__ == '__main__':
    app = wx.App()
    Example_FloatSpin(None, title='Check FloatSpin')
    app.MainLoop()