Foros del Web » Programando para Internet » Python »

wx.lib.masked

Estas en el tema de wx.lib.masked en el foro de Python en Foros del Web. Hola a todos, estoy teniendo un error usando la libreria wx.lib.masked y la verdad no tengo idea que pueda ser: tengo la siguiente clase: Código: ...
  #1 (permalink)  
Antiguo 19/09/2010, 16:47
 
Fecha de Ingreso: abril-2008
Mensajes: 68
Antigüedad: 16 años, 1 mes
Puntos: 0
wx.lib.masked

Hola a todos, estoy teniendo un error usando la libreria wx.lib.masked y la verdad no tengo idea que pueda ser:

tengo la siguiente clase:

Código:
from    wx.lib import masked

class Numeric_float(masked.NumCtrl):
    def __init__(self, parent):
        masked.NumCtrl.__init__(self,parent,value=10, integerWidth=2, allowNegative=False)
la uso asi:

Código:
cant = Numeric_float(self)
el error que me da es al ejecutar:
Código:
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 14618, in <lambda>
    lambda event: event.callable(*event.args, **event.kw) )
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\lib\masked\numctrl.py", line 1173, in _CheckInsertionPoint
    if sel_to < self._fields[0]._extent[1] and text[sel_to] in (' ', '-', '('):
IndexError: string index out of range
y al ingresar un caracter
Código:
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\lib\masked\maskededit.py", line 3066, in _OnChar
    if keep_processing and self._isCharAllowed( char, pos, checkRegex = True ):
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\lib\masked\maskededit.py", line 4717, in _isCharAllowed
    newvalue, ignore, ignore, ignore, ignore = self._insertKey(char, at, sel_start, sel_to, value, allowAutoSelect=True)
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\lib\masked\maskededit.py", line 5119, in _insertKey
    if fstr[0] in erasable_chars or (self._signOk and field._index == 0 and fstr[0] in ('-','(')):
IndexError: string index out of range
... necesito usar un textctrl que permita solo float positivos...


Saludos
  #2 (permalink)  
Antiguo 19/09/2010, 17:43
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: wx.lib.masked

Ejemplo de como usar NumCtrl
run.py necesario para el ejemplo.

Por cierto checa la longitud de tu cadena antes de acceder a un elemento de la misma.
  #3 (permalink)  
Antiguo 19/09/2010, 21:19
 
Fecha de Ingreso: abril-2008
Mensajes: 68
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: wx.lib.masked

Gracias razpetia conosco ese code, es del la libreria de wxpython demo, de ahi me base para hacer la clase Numeric_float , pero el problema es la implementacion.... yo quiero un control que tenga 2 digitos de decimal... pero no se porque me tira ese error...
  #4 (permalink)  
Antiguo 19/09/2010, 22:58
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: wx.lib.masked

Te funciona el demo? Si es así entonces dudo que sea problema de la librería.

Igual te recomendaría volver a lo básico.

Código Python:
Ver original
  1. import wx
  2.  
  3. def validate(value):
  4.     try:
  5.         return float(value)
  6.     except ValueError:
  7.         pass
  8.  
  9. class Frame(wx.Frame):
  10.     def __init__(self, *args, **kwargs):
  11.         wx.Frame.__init__(self, *args, **kwargs)
  12.         Panel(self)
  13.        
  14.  
  15. class Panel(wx.Panel):
  16.     def __init__(self, parent, *args, **kwargs):
  17.         wx.Panel.__init__(self, parent, *args, **kwargs)
  18.  
  19.         self.Txt = Txt = wx.TextCtrl(self, -1)
  20.         Txt.Bind(wx.EVT_TEXT_ENTER, self.OnClick)
  21.        
  22.         Btn = wx.Button(self, label="Click me!", pos=(0, 30))
  23.         Btn.Bind(wx.EVT_BUTTON, self.OnClick)
  24.        
  25.  
  26.     def OnClick(self, *event):
  27.         data = self.Txt.GetValue()
  28.         if( validate(data) is not None):
  29.             print "%s es un flotante" % data
  30.         else:
  31.             print "%s no es un flotante" % data
  32.  
  33. app = wx.App(False)
  34. f = Frame(None, title="Titulo")
  35. f.Show()
  36. app.MainLoop()

Puedes redondear un flotante con round(num, ndigits).
  #5 (permalink)  
Antiguo 20/09/2010, 15:57
AxL456
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: wx.lib.masked

buenas..

por aqui no va el problema pero para que le haces un subclass?? lo unico que haces es modificar los parametros de llamada, me parece codigo innecesario hacer un subclass..

yo uso el numctrl en una aplicacion que tengo y lo hago de esta manera:

Código Python:
Ver original
  1. import wx
  2. from wx.lib.masked import NumCtrl
  3.  
  4. ....
  5.  
  6. foo = NumCtrl(self.panel, -1, pos=(10, 110), integerWidth = 7,
  7.                                  fractionWidth = 2)
  #6 (permalink)  
Antiguo 22/09/2010, 11:54
 
Fecha de Ingreso: abril-2008
Mensajes: 68
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: wx.lib.masked

Hola gracias, me parece que voy a tener que hacer algo parecido al lo que me decis razpetia.

Pero me gustaba mas usar el control en mi propia clase, porque lo voy a usar en muchos formularios y tiene metodos comunes como colorear cuando tiene el foco y no quiero escribir lo mismo las 300 veces que voy a usar el control.

Igualmente AxL456, cuando lo uso fuera de la clase me arroja este error

Código:
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 14618, in <lambda>
    lambda event: event.callable(*event.args, **event.kw) )
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\lib\masked\numctrl.py", line 1173, in _CheckInsertionPoint
    if sel_to < self._fields[0]._extent[1] and text[sel_to] in (' ', '-', '('):
IndexError: string index out of range
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 14618, in <lambda>
    lambda event: event.callable(*event.args, **event.kw) )
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\lib\masked\numctrl.py", line 1173, in _CheckInsertionPoint
    if sel_to < self._fields[0]._extent[1] and text[sel_to] in (' ', '-', '('):
IndexError: string index out of range
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 14618, in <lambda>
    lambda event: event.callable(*event.args, **event.kw) )
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\lib\masked\numctrl.py", line 1173, in _CheckInsertionPoint
    if sel_to < self._fields[0]._extent[1] and text[sel_to] in (' ', '-', '('):
IndexError: string index out of range
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 14618, in <lambda>
    lambda event: event.callable(*event.args, **event.kw) )
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\lib\masked\numctrl.py", line 1173, in _CheckInsertionPoint
    if sel_to < self._fields[0]._extent[1] and text[sel_to] in (' ', '-', '('):
IndexError: string index out of range
Me parece que esta evaluando una cadena vacia.

Ninguna llamada de mi code llama al error, me parece que es parte del loop de wx porque se produce en : File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 14618, in <lambda>

Saludos
  #7 (permalink)  
Antiguo 22/09/2010, 12:43
 
Fecha de Ingreso: abril-2008
Mensajes: 68
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: wx.lib.masked

Bueno finalmente hice esta clase
Código:
class Numeric_float(wx.TextCtrl):
    def __init__(self,*args, **kwds):
        wx.TextCtrl.__init__(self, *args, **kwds)
        self.Bind(wx.EVT_CHAR, self.OnChar)
        self.Bind(wx.EVT_KILL_FOCUS,self.Round)
        self.digits = ['0','1','2','3','4','5','6','7','8','9','.']
        
    def OnChar(self,event):
        key = event.GetKeyCode()
        if key < wx.WXK_SPACE or key == wx.WXK_DELETE or key > 255:
            event.Skip()
            return
        if chr(key) == '.':
            text = self.GetValue()
            if chr(key) in text or len(text) == 0:
                return
        if chr(key) in self.digits:
            event.Skip()
            return
    def Round(self,evt):
        try:
            num = float(self.GetValue())
            text = str(round(num,2))
            self.SetValue(text)
        except ValueError:
            pass
  #8 (permalink)  
Antiguo 22/09/2010, 22:33
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: wx.lib.masked

Por cierto algo que mi di cuenta es que mi modulo esta en:

Código code:
Ver original
  1. C:\Python26\Lib\site-packages\wx-2.8-msw-ansi

Mientras que el tuyo es:
Código code:
Ver original
  1. C:\Python26\lib\site-packages\wx-2.8-msw-unicode
Talvez le tienes que pasar como parámetro cadenas unicode o tal vez instalar ansi.(Y obviamente desinstalar primero la unicode).

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:27.