wx.SpinCtrl
僅限於跨整數旋轉,而不是浮動。因此,我正在構建一個wx.TextCtrl
+ wx.SpinButton
組合類,它使我可以旋轉浮游物。我能夠以編程方式對它們進行大小和佈局,以便組合看起來與普通wx.SpinCtrl
完全相同。wxPython:「超級」wx.SpinCtrl浮點值,sizer內的佈局
我從wx.TextCtrl
繼承這個組合,因爲我想讓它的父面板捕捉wx.EVT_TEXT
事件。如果你能改進我的這個論點,我將不勝感激。
wx.EVT_SPIN_UP
和wx.EVT_SPIN_DOWN
來自wx.SpinButton
的事件都是內部實現,並且父框架不關心這些事件。
現在,我只是碰到一堵磚牆。我的組合類不適用於sizer。在組合類別wx.GridBagSizer
之後,只有wx.TextCtrl
被佈置在wx.GridBagSizer
內。 wx.SpinButton
本身就是自己的。儘管如此,wx.EVT_SPIN*
綁定工作得很好。
我的問題是佈局。如果我想讓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)
好吧,我會看看'wx.lib.agw.FloatSpin'。 關於您給我的其他鏈接(CreatingCustomControls),它需要直接繪製位圖,目前我不願意這樣做。 在wxPython中有一個使sizer能夠將兩個小部件視爲一個的過程嗎?在MS Word中繪製多個對象時,它應該與組功能類似。 – Kit 2010-07-16 04:09:51
'FloatSpin'看起來很有前景:)但是這個'wx.PyControl'與'wx.Sizer'包含我的'wx.TextCtrl'和'wx.SpinButton'真的很有趣。我遇到'SetSizer(sizer)''wx.PyControl'的問題,但那會是另一個問題。謝謝你的時間,拉爾夫! – Kit 2010-07-17 12:51:07