2010-01-14 91 views

回答

12

GTK +不是線程安全的,所以您不應該簡單地從其他線程調用GUI更新方法。 glib.idle_add(或舊版PyGTK版本中的gobject.idle_add)可用於此目的。

而是寫的:

label.set_text("foo") 

你可以這樣寫:

glib.idle_add(label.set_text, "foo") 

這將導致函數調用的GTK +排隊。

如果您需要運行多個語句,它往往更容易將它們包裝在一個函數:

def idle(): 
    label1.set_text("foo") 
    label2.set_text("bar") 
glib.idle_add(idle) 

確保函數傳遞給idle_add不返回True;否則它會再次排隊。

編輯:正如Daniel指出的那樣,您需要首先在您的程序的任何地方撥打gtk.gdk.threads_init()

-1

可以使用gobject.idle_add方法,其語法和上面一樣,你必須導入模塊GObject的

2

正如在以前的答案陳述來實現,GTK是不一樣的「線程安全的」,但它是「線程感知」 - 請參閱主題:https://developer.gnome.org/gdk2/stable/gdk2-Threads.html

爲了從另一個線程修改GTK小部件,您必須使用GTK的鎖定。呼叫gtk.threads_init()導入GTK模塊後,然後您可以更新,像這樣:

gtk.threads_enter() 
# make changes... 
gtk.threads_leave() 

注意上面將無法工作在Windows上(見上面的鏈接)。在Windows上,您必須使用gobject.idle_add(),如上所述,但不要忘記在代碼中導入gobject後直接輸入gobject.threads_init()! idle_add()函數將在主線程(運行gtk.main()的線程)中執行更新本身。

+0

好點。有關這兩種方法的另一個好消息可以在PyGTK FAQ條目中看到:http://faq.pygtk.org/index.py?file=faq20.006.htp&req=show – 2010-01-15 08:13:09

-1

約翰內斯說的是正確的,但是因爲GTK是glib和gobject事物的包裝器,所以實際上你會想要使用gtk.idle_add()。不需要不必要的進口。

相關問題