Lỗi phạm vi rất kỳ lạ mà tôi thậm chí không thể nhìn thấy. Bên trong một chức năng cập nhật, tôi có một hàm helper lồng nhau để ... giúp đỡ w/một cái gì đó:pygtk: biến miễn phí được tham chiếu trước khi gán trong phạm vi kèm theo
def attach_row(ws,r1,r2):
es = []
for i,w in enumerate(ws):
eb = gtk.EventBox()
a = gtk.Alignment(xalign=0.0,yalign=0.5)
a.add(w)
eb.add(a)
eb.set_style(self.rowStyle.copy())
es.append(eb)
self.table.attach(eb, i, i+1, r1, r2,
xoptions=gtk.EXPAND|gtk.FILL,
yoptions=gtk.SHRINK)
def ene(_,ev):
for eb in es:
eb.set_state(gtk.STATE_PRELIGHT)
def lne(_,ev):
for eb in es:
eb.set_state(gtk.STATE_NORMAL)
for eb in es:
eb.connect('enter-notify-event', ene)
eb.connect('leave-notify-event', lne)
này hoạt động một lần trong một thời gian, nhưng nếu bản cập nhật() chức năng chạy quá nhiều, tôi cuối cùng đã nhận được:
for eb in es:
NameError: free variable 'es' referenced before assignment in enclosing scope
Điều gì gây ra điều này? es chắc chắn nhất được chỉ định trước khi những chức năng đó được gọi. Đúng không? Là một số điều kỳ lạ xảy ra ở đâu vì một lý do nào đó ene() cho một hàng được tạo trước đó được gọi trong khi hàng mới đang được tạo và đóng trên es
bị ghi đè?
hehe, true. Tôi thực sự nhận ra rằng tôi có cách làm tốt hơn - thay vì xóa và gắn nhiều hàng, tôi chỉ cần tạo một bộ và thay đổi các vật dụng bên trong chúng. Một lưu ý, mặc dù: Tôi đã thử chuyển "es" làm dữ liệu người dùng cho các hàm ene và lne đó. Điều thú vị là tôi không còn nhận được NameError nữa, nhưng các widget sẽ không nổi bật chút nào. SOmething vẫn đang bị mất ở đâu đó. Nếu điều này xuất hiện trở lại, tôi sẽ thử ý tưởng lớp học. – Claudiu
thậm chí tốt hơn cách - sử dụng một VBox, đặt một hộp sự kiện mỗi hàng, và sau đó sử dụng một nhóm để sắp xếp các cột – Claudiu
yeah điều này đã xảy ra trong các tình huống khác quá. tôi nghĩ là python 2.5 weirdness. vẫn chưa bao giờ tìm thấy câu trả lời – Claudiu