gpt4 book ai didi

python - wxPython: "Super"wx.SpinCtrl with float values, layout inside sizer

转载 作者:太空狗 更新时间:2023-10-30 01:10:29 34 4
gpt4 key购买 nike

wx.SpinCtrl 仅限于整数旋转,而不是 float 。因此,我正在构建一个 wx.TextCtrl + wx.SpinButton 组合类,它使我能够旋转 float 。我能够以编程方式调整它们的大小和布局,以便组合看起来与普通的 wx.SpinCtrl 完全一样。

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

来自 wx.SpinButtonwx.EVT_SPIN_UPwx.EVT_SPIN_DOWN 事件都是内部实现,父框架不关心关于这些事件。

现在,我碰壁了。我的组合类不适用于 sizer。在 .Add() 将组合类添加到 wx.GridBagSizer 之后,只有 wx.TextCtrlwx 中布局.GridBagSizerwx.SpinButton 由它自己保留。不过,wx.EVT_SPIN* 绑定(bind)工作得很好。

我的问题是布局。如果我想让 wx.GridBagSizer 把它当作一个小部件,我应该怎么写这个类?

这是我的组合类代码:

class SpinnerSuper(wx.TextCtrl):
def __init__(self, parent, max):
wx.TextCtrl.__init__(self, parent=parent, size=(48, -1))
spin = wx.SpinButton(parent=parent, style=wx.SP_VERTICAL, size=(-1, 21))
self.OnInit()
self.layout(spin)
self.internalBindings(spin)
self.SizerFlag = wx.ALIGN_CENTER

self.min = 0
self.max = max

def OnInit(self):
self.SetValue(u"0.000")

def layout(self, spin):
pos = self.GetPosition()
size = self.GetSize()
RightEdge = pos[0] + size[0]
TopEdge = pos[1] - (spin.GetSize()[1]/2 - size[1]/2)
spin.SetPosition((RightEdge, TopEdge))

def internalBindings(self, spin):
spin.Bind(wx.EVT_SPIN_UP, self.handlerSpinUp(self), spin)
spin.Bind(wx.EVT_SPIN_DOWN, self.handlerSpinDown(self), spin)

def handlerSpinUp(CallerObject, *args):
def handler(CallerObject, *data):
text = data[0]
prev = text.GetValue()
next = float(prev) + 0.008
text.SetValue("{0:0.3f}".format(next))
return lambda event: handler(CallerObject, *args)

def handlerSpinDown(CallerObject, *args):
def handler(CallerObject, *data):
text = data[0]
prev = text.GetValue()
next = float(prev) - 0.008
text.SetValue("{0:0.3f}".format(next))
return lambda event: handler(CallerObject, *args)

最佳答案

如果你想让你的控件成为由 sizer 正确管理。看看CreatingCustomControls .

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

回应您的评论:

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

关于python - wxPython: "Super"wx.SpinCtrl with float values, layout inside sizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3261342/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com