Tín hiệu có tự động ngắt kết nối khi đối tượng mục tiêu bị hủy không? Nếu không ghi lại id tín hiệu từ g_signal_connect(), tôi có thể xóa tín hiệu đó không?Làm thế nào để ngắt kết nối tín hiệu của Gtk?
13
A
Trả lời
13
Nếu bạn không lưu ID trình xử lý tín hiệu, bạn có thể tìm kiếm bằng cách sử dụng g_signal_handler_find()
và ngắt kết nối theo cách thông thường hoặc ngắt kết nối bất kỳ tín hiệu nào phù hợp với tiêu chí nhất định với g_signal_handlers_disconnect_matched()
hoặc g_signal_handlers_disconnect_by_func()
.
7
Tất nhiên khi đối tượng đích bị hủy, các tín hiệu kết nối với nó sẽ bị xóa (nếu không sẽ có rò rỉ bộ nhớ lớn, nhưng đọc cảnh báo trên g_signal_connect_object). Tuy nhiên, để gọi g_signal_handler_disconnect, bạn cần id trình xử lý được cung cấp bởi g_signal_connect
và bạn bè.
1
Bạn có thể sử dụng các phương thức * handler_block_by_func * và * handler_unblock_by_func *.
Ví dụ (PyGTK):
def on_treeview_fixedexpenses_cursor_changed(self, widget):
self.checkbutton_fixedexpensetax.handler_block_by_func(self.on_checkbutton_fixedexpensetax_toggled)
self.updateCurrentFixedExpense()
self.checkbutton_fixedexpensetax.handler_unblock_by_func(self.on_checkbutton_fixedexpensetax_toggled)
Nguồn: http://www.pygtk.org/docs/pygobject/class-gobject.html