2011-01-17 6 views
3

Я ищу возможность использовать wxSlider со значениями с плавающей запятой, но не могу найти никаких рабочих примеров. Here предлагается подкласс, но я не получаю, если все методы должны быть переопределены?WxSlider с плавающей запятой?

очень благодарен за возможные показания.

ответ

2

См. Класс wx.lib.agw.FloatSpin.

+0

Спасибо, мне тоже было нужно. – Tornasole

+0

В конце концов, мне удалось сделать все с этим классом. Большое спасибо! – Tornasole

0

Он только изменяет возвращаемое значение; все остальные методы должны автоматически выводиться из wx.Slider. Он должен работать как дан.

Почему бы вам не попробовать и не посмотреть?

+0

мне нужен слайдер, который я мог бы инициализировать на MAX_VALUE как 2,5, т.е. с плавающей точкой и значение wx.slider конструктор принимает только целое число. На самом деле я пытался, но не был успешным. – Tornasole

3

Я придумал следующее решение, которое отлично подходит для моей цели в Linux. (вам не нужно переопределить GetRange, так как он работает в автоматическом режиме с перегруженной GetMin/Макс.)

""" floating point slider customized from wx.Slider """ 


import wx 


class FloatSlider(wx.Slider): 

    def __init__(self, parent, id, value, minval, maxval, res, 
       size=wx.DefaultSize, style=wx.SL_HORIZONTAL, 
       name='floatslider'): 
     self._value = value 
     self._min = minval 
     self._max = maxval 
     self._res = res 
     ival, imin, imax = [round(v/res) for v in (value, minval, maxval)] 
     self._islider = super(FloatSlider, self) 
     self._islider.__init__(
      parent, id, ival, imin, imax, size=size, style=style, name=name 
     ) 
     self.Bind(wx.EVT_SCROLL, self._OnScroll) 

    def _OnScroll(self, event): 
     ival = self._islider.GetValue() 
     imin = self._islider.GetMin() 
     imax = self._islider.GetMax() 
     if ival == imin: 
      self._value = self._min 
     elif ival == imax: 
      self._value = self._max 
     else: 
      self._value = ival * self._res 
     event.Skip() 
     #print 'OnScroll: value=%f, ival=%d' % (self._value, ival) 

    def GetValue(self): 
     return self._value 

    def GetMin(self): 
     return self._min 

    def GetMax(self): 
     return self._max 

    def GetRes(self): 
     return self._res 

    def SetValue(self, value): 
     self._islider.SetValue(round(value/self._res)) 
     self._value = value 

    def SetMin(self, minval): 
     self._islider.SetMin(round(minval/self._res)) 
     self._min = minval 

    def SetMax(self, maxval): 
     self._islider.SetMax(round(maxval/self._res)) 
     self._max = maxval 

    def SetRes(self, res): 
     self._islider.SetRange(round(self._min/res), round(self._max/res)) 
     self._islider.SetValue(round(self._value/res)) 
     self._res = res 

    def SetRange(self, minval, maxval): 
     self._islider.SetRange(round(minval/self._res), round(maxval/self._res)) 
     self._min = minval 
     self._max = maxval 


if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    myframe = wx.Frame(None, size=(100, 30), pos=(200, 200), 
         style=wx.FIXED_MINSIZE|wx.CLOSE_BOX) 
    fslider = FloatSlider(myframe, -1, 0.2, 0.10004, 1.00008, 1e-4) 
    myframe.Show() 
    app.MainLoop() 
+0

Я изменил SetRange, чтобы избежать min> max в предыдущем коде и реализовал Get/SetRes. –

+0

Очень полезно, спасибо! – Tony

Смежные вопросы