2010-01-14 27 views

Trả lời

12

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.

-1

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

2

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()).

+0

Đ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 –

-1

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.

Các vấn đề liên quan