Sono nuovo in Python - scusa se la mia terminologia è errata. Ho una classe che eredita lo Enthought Traits attributes. Ecco una versione semplificata:Modifica parametro proprietà dal costruttore della classe [Python/Tratti]
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()
Questo crea semplicemente una finestra con una slider in esso, originariamente intenzione 0,0-0,6 con valore iniziale 0,1. Quando si crea un'istanza di GUIThing, voglio variare il valore massimo per il cursore in base al valore corrente di top_range
. Tuttavia la linea
self.my_slider._high = arg1
risultati in
AttributeError: 'float' object has no attribute '_high'
Quando all'interno __init__()
, self.my_slider
rendimenti non dell'oggetto cursore, ma il valore corrente del cursore.
Cosa sto sbagliando? Grazie!
Edit:
seguito anche non funziona:
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'))
Questo sarebbe il modo diretto di fare quello che sto cercando di fare, ma si traduce in una GUI in cui invece di un cursore, c'è una casella di testo che legge "enthought.traits.trait_types.oggetto Ranger a 0xa61946c". Quindi il problema è che quando my_slider
viene creato all'interno di __init__()
allora "my_slider" diventa l'oggetto stesso (che non viene visualizzato correttamente tramite Visualizza); ma se my_slider
viene creato al di fuori di __init__()
allora "my_slider" diventa il valore corrente (un valore float che impedisce l'accesso alle proprietà dell'oggetto).
Non so se questo è peculiare di Tratti o semplicemente non so come inizializzare correttamente gli oggetti.
In generale, la sottolineatura prefisso in '' _high'' implica che è privato e non si deve accedervi in questo modo. –
Giusto, grazie. Ma non riesco a trovare nei documenti come si potrebbe invece accedervi. E anche se non è il modo corretto - funziona al di fuori di '__init__'. Quindi non capisco perché è diverso * all'interno di * '__init__' (vedi anche modifica su OP). – Pteridium
La mia ipotesi (non ho familiarità con la libreria) è che il '' __init __() '' della superclasse usa '' Range'', ma non mantiene alcun riferimento ad esso. Se ciò è vero, hai provato a mettere la riga '' self.my_slider = Range (0.0, arg1, 0.0) '' prima di '' HasTraits .__ init __ (self) '' all'interno di '' __init __() ''? –