Tôi đang sử dụng PyGTK để xây dựng một ứng dụng GUI. Tôi muốn cập nhật tiện ích xem văn bản từ một chuỗi khác nhưng tiện ích không nhận được cập nhật mỗi khi tôi thử cập nhật. Tôi nên làm gì để cập nhật GUI đáng tin cậy?GUI không được cập nhật từ một chủ đề khác khi sử dụng PyGtk
Trả lời
GTK + không an toàn với luồng, vì vậy bạn không nên đơn giản gọi các phương thức cập nhật GUI từ các chủ đề khác. glib.idle_add (hoặc gobject.idle_add trong phiên bản PyGTK cũ hơn) có thể được sử dụng cho mục đích này.
Thay vì viết:
label.set_text("foo")
bạn sẽ viết:
glib.idle_add(label.set_text, "foo")
gây cuộc gọi chức năng để được xếp hàng trong GTK +.
Nếu bạn cần chạy nhiều báo cáo, nó thường dễ dàng hơn để bọc chúng trong một hàm:
def idle():
label1.set_text("foo")
label2.set_text("bar")
glib.idle_add(idle)
Hãy chắc chắn rằng các hàm được chuyển vào idle_add
không trả lại True
; nếu không nó sẽ được xếp hàng một lần nữa.
Chỉnh sửa: Như Daniel đã chỉ ra, trước tiên bạn cần gọi gtk.gdk.threads_init()
ở bất kỳ đâu trong chương trình của mình.
cùng có thể đạt được bằng phương pháp gobject.idle_add có cú pháp là tương tự như trên, bạn cần phải nhập khẩu các mô-đun gobject
Như đã nêu trong các câu trả lời trước đó, GTK không phải là "chủ đề an toàn", nhưng nó là "thread-aware" - xem trang này trên Chủ đề: https://developer.gnome.org/gdk2/stable/gdk2-Threads.html
Để sửa đổi các tiện ích GTK từ một chuỗi khác, bạn phải sử dụng khóa của GTK. Gọi gtk.threads_init()
ngay lập tức sau khi nhập các module gtk, và sau đó bạn có thể cập nhật như sau:
gtk.threads_enter()
# make changes...
gtk.threads_leave()
Lưu ý rằng ở trên sẽ không làm việc trên Windows (xem liên kết ở trên). Trên Windows, bạn phải sử dụng gobject.idle_add()
như được giải thích ở trên, mặc dù đừng quên đặt trực tiếp gobject.threads_init()
sau khi nhập mã vào trong mã của bạn! Hàm idle_add() sẽ thực thi bản cập nhật trong chuỗi chính (chuỗi chạy gtk.main()).
Những gì Johannes nói là chính xác, tuy nhiên vì GTK là một trình bao bọc cho những thứ glib và gobject, bạn thực sự muốn sử dụng gtk.idle_add(). Không cần nhập khẩu không cần thiết.
- 1. Cập nhật GUI (WPF) bằng cách sử dụng một chủ đề khác
- 2. Cập nhật nhãn từ một chủ đề khác
- 3. Cách cập nhật hộp văn bản trên GUI từ một chủ đề khác
- 4. PySide: Cách dễ dàng hơn để cập nhật GUI từ một chủ đề khác
- 5. Cập nhật một ObservableCollection từ một chủ đề khác
- 6. Chủ đề WPF và GUI cách truy cập đối tượng từ chuỗi khác nhau?
- 7. Ứng dụng biểu mẫu Windows C# - Cập nhật GUI từ một chuỗi và lớp khác?
- 8. Cách áp dụng chủ đề cho ứng dụng PyGTK
- 9. Biến truy cập từ một lớp khác từ một chủ đề
- 10. Cách làm việc với các chủ đề trong pygtk
- 11. Tại sao BackgroundWorker_RunWorkerCompleted không cập nhật GUI?
- 12. WEBrick: RequestURITooLớn: tôi có nên cập nhật hoặc sử dụng một máy chủ khác không?
- 13. Cập nhật ListView trong chuỗi chính từ một chủ đề khác
- 14. Đang cập nhật GUI: Runnables vs Messages
- 15. Cập nhật giá trị tối đa từ nhiều chủ đề
- 16. NSDateFormatter bị treo khi được sử dụng từ các chủ đề khác nhau
- 17. Tại sao một số đối tượng không thể truy cập từ các chủ đề khác nhau?
- 18. Làm cho Github đẩy đến một máy chủ từ xa khi nó nhận được cập nhật
- 19. Cập nhật chủ đề không khả dụng cho khách hàng được chọn
- 20. Cách cập nhật GUI SWT từ một luồng khác trong Java
- 21. cập nhật JTree trong java GUI
- 22. Mercurial - Khi nào sử dụng cập nhật
- 23. Truy cập các giao diện từ chủ đề khác (Android)
- 24. Cập nhật tổng thể cục bộ cho chủ từ xa từ một chi nhánh khác
- 25. JavaFX: Đang cập nhật phần UI trong một lớp điều khiển từ một chủ đề
- 26. Cập nhật WPF ràng buộc trong một chủ đề nền
- 27. Android: Cập nhật Listview sau khi Chủ đề tải dữ liệu từ mạng
- 28. Chạy GUI Cocoa trong một chủ đề không chính
- 29. Có an toàn khi truy cập một biến từ chủ đề chính sau khi nó được viết bởi một luồng khác và sau khi chuỗi đó được nối?
- 30. Chủ đề ngủ từ một số khác
Điểm tốt. Một bài viết hay khác về hai cách tiếp cận này có thể được nhìn thấy trong mục nhập FAQ PyGTK: http://faq.pygtk.org/index.py?file=faq20.006.htp&req=show –