Soy nuevo en Python: lo siento si mi terminología es incorrecta. Tengo una clase que hereda el Enthought Traits attributes. Aquí es una versión simplificada:Cambiar el parámetro de propiedad desde dentro del constructor de clase [Python/Rasgos]
from enthought.traits.api import HasTraits, Range
from enthought.traits.ui.api import View, Item
class GUIThing(HasTraits):
my_slider = Range(0.0, 0.6, 0.1)
my_slider._high = 0.7 # works; not what I need 'coz not instance-dependent
view = View(Item('my_slider'))
def __init__(self, arg1):
# Call the parent's __init__
HasTraits.__init__(self)
self.my_slider._high = arg1 # what I need; doesn't work
# -- Main program -----
top_range = 0.9
my_gui = GUIThing(top_range)
my_gui.configure_traits()
Esto simplemente crea una ventana con una slider en ella, originalmente iba 0,0-0,6 con valor inicial de 0,1. Al crear una instancia de GUIThing, deseo variar el valor máximo para el control deslizante según el valor actual de top_range
. Sin embargo la línea
self.my_slider._high = arg1
resultados en
AttributeError: 'float' object has no attribute '_high'
Cuando dentro __init__()
, self.my_slider
rendimientos no objeto Slider, pero el valor actual del control deslizante.
¿Qué estoy haciendo mal? ¡Gracias!
Editar:
Lo siguiente también no funciona:
class GUIThing(HasTraits):
def __init__(self, arg1):
# Call the parent's __init__
HasTraits.__init__(self)
self.my_slider = Range(0.0, arg1, 0.0)
view = View(Item('my_slider'))
Esa sería la forma más directa de hacer lo que estoy tratando de hacer, sino que se traduce en una interfaz gráfica de usuario, donde en lugar de un control deslizante, hay un cuadro de texto que dice "objeto enthought.traits.trait_types.Range en 0xa61946c". Entonces, el problema es que cuando se crea my_slider
dentro de __init__()
, entonces "my_slider" viene a significar el objeto mismo (que no se muestra correctamente a través de View); pero si se crea my_slider
fuera de __init__()
, entonces "my_slider" viene a significar el valor actual (un flotante, que impide el acceso a las propiedades del objeto).
No estoy seguro de si esto es peculiar de los rasgos o simplemente no sé cómo inicializar los objetos correctamente.
general, el guión prefijado en '' _high'' implica que es privado y no se debe estar accediéndolo así. –
Derecha, gracias. Pero no puedo encontrar en los documentos cómo uno podría acceder a él en su lugar. E incluso si no es la forma correcta, funciona fuera de '__init__'. Por lo tanto, no entiendo por qué es diferente * dentro de '' __init__' (vea también editar para OP). – Pteridium
Mi suposición (no estoy familiarizado con la biblioteca) es que la '' __init__() '' de la superclase utiliza el '' Rango'', pero no mantiene referencia a ella. Si eso es cierto, ¿ha intentado colocar la línea '' self.my_slider = Range (0.0, arg1, 0.0) '' before '' HasTraits .__ init __ (self) '' dentro de '' __init __() ''? –