Tôi mới dùng python - xin lỗi nếu thuật ngữ của tôi sai. Tôi có một lớp kế thừa Enthought Traits attributes. Đây là một phiên bản đơn giản:Thay đổi thông số thuộc tính từ bên trong lớp khởi tạo [Python/Traits]
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()
này chỉ đơn giản là tạo ra một cửa sổ với một slider trong nó, ban đầu sẽ 0,0-0,6 với giá trị ban đầu 0.1. Khi tạo một thể hiện GUIThing, tôi muốn thay đổi giá trị tối đa cho thanh trượt tùy thuộc vào giá trị top_range
hiện tại. Tuy nhiên dòng
self.my_slider._high = arg1
kết quả trong
AttributeError: 'float' object has no attribute '_high'
Khi trong __init__()
, self.my_slider
lợi nhuận không phải là đối tượng thanh trượt, nhưng giá trị hiện tại của thanh trượt.
Tôi đang làm gì sai? Cảm ơn!
Edit:
Sau đây cũng không hoạt động:
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'))
Đó sẽ là cách trực tiếp để làm những gì tôi đang cố gắng để làm, nhưng nó kết quả trong một giao diện nơi thay vì một thanh trượt, có một hộp văn bản đọc "enthought.traits.trait_types.Range đối tượng tại 0xa61946c". Vì vậy, vấn đề là khi my_slider
được tạo trong phạm vi __init__()
thì "my_slider" có nghĩa là đối tượng chính nó (không hiển thị chính xác qua Chế độ xem); nhưng nếu my_slider
được tạo bên ngoài __init__()
thì "my_slider" có nghĩa là giá trị hiện tại (một phao; ngăn chặn quyền truy cập vào thuộc tính đối tượng).
Không chắc chắn điều này có đặc thù đối với Đặc điểm hay không, tôi không biết cách khởi tạo đối tượng đúng cách.
Nói chung, gạch tiền tố trong ' '_high'' ngụ ý rằng nó là tư nhân và bạn không nên được truy cập nó như thế. –
Phải, cảm ơn. Nhưng tôi không thể tìm thấy trong tài liệu như thế nào người ta sẽ truy cập nó thay vào đó. Và ngay cả khi nó không phải là cách thích hợp - nó hoạt động bên ngoài '__init__'. Vì vậy, tôi không hiểu tại sao nó khác * trong * '__init__' (cũng xem chỉnh sửa thành OP). – Pteridium
Đoán của tôi (tôi không quen thuộc với thư viện) là '' __init __() '' của siêu lớp sử dụng '' Phạm vi'', nhưng không giữ tham chiếu đến nó. Nếu điều đó đúng, bạn đã thử đặt dòng '' self.my_slider = Range (0.0, arg1, 0.0) '' trước '' HasTraits .__ init __ (self) '' trong '' __init __() ''? –