2014-07-14 70 views
0

我有一個腳本,我寫出了對gkt和cmd的helloworld的修改。正在使用python線程與gtk,和CMD好嗎?

#!/usr/bin/python 
import cmd 
from gi.repository import Gtk 
import threading 

class GtkInterface(object): 

    def __init__(self): 
     win = Gtk.Window() 
     win.connect("delete-event", Gtk.main_quit) 
     win.show_all() 
     self.window = win; 
    def create_button(self): 
     self.button = Gtk.Button(label="Click Here") 
     self.button.connect("clicked", self.on_button_clicked) 
     self.window.add(self.button) 
     self.window.show_all() 

    def on_button_clicked(self, widget): 
     print 'something happened' 
     return 


class HelloWorld(cmd.Cmd): 
    #Simple command processor example. 
    prompt='>' 
    def __init__(self, gtk_object): 
     cmd.Cmd.__init__(self) 
     # or cmd.Cmd.__init__(self) 
     self.gtk_object = gtk_object 

    def do_greet(self, line): 
     print "hello" 

    def do_setbutton(self, line): 
     self.gtk_object.create_button() 

    def do_exit(self, line): 
     return True 

gtk_o = GtkInterface() 
hello = HelloWorld(gtk_o) 

def worker(num): 
    """thread worker function""" 
    #print 'Worker: %s' % num 
    hello.cmdloop() 
    return 

def worker2(num): 
    Gtk.main() 

threads = [] 


t = threading.Thread(target=worker, args=(1,)) 
threads.append(t) 
t2 = threading.Thread(target=worker2, args=(2,)) 
threads.append(t2) 


if __name__ == '__main__': 
    #HelloWorld().cmdloop() 
    #Gtk.main() 
    t.start() 
    t2.start() 

This works。我想知道的是這可以嗎?是否有問題需要注意?這是我第一次嘗試這個,所以對我來說有很多未知數。我明白,cmd和gtk都是阻塞的。到目前爲止,Gtk.main和cmd循環完美無缺。我只是謹小慎微。

我第一次使用線程。當cmd獲得設置按鈕的命令時,該按鈕被設置。當按鈕被點擊'發生了什麼'打印。命令行繼續,好像沒有什麼不尋常的事情發生。我真的很驚訝它是如何無縫運作的。但我仍然有點擔心。

回答

0

GTK +不是線程安全的,這個例子有一些問題可能導致不穩定。該示例在主線程中加載GTK +,在不同的線程中運行GTK +主循環,並在另一個線程中創建GTK +小部件。所有GTK + API調用都應該在主線程中進行,其他線程通過添加空閒或定時器回調來回傳給主GUI線程。閱讀PyGObject線程wiki [1]。

  1. https://wiki.gnome.org/Projects/PyGObject/Threading
+0

這只是爲了保持執行順序嗎?就像某個線程正在運行,但其他一些所需的數據尚未從另一個線程產生? –

+0

我試着將Gtk主循環移動到主線程,並且它工作得更好。出現了另一個解決的問題。切換接受的答案。 –

1

GTK有其自己的線程庫,你要小心,我認爲對於複雜應用程序:http://faq.pygtk.org/index.py?req=show&file=faq20.006.htp - 例如,當你有螺紋,indepedently主線程的更新您的GUI。

在你的例子中你確實有一個線程應用程序,儘管實際上你的整個GTK應用程序都在一個線程中運行 - 所以你沒問題。

+0

看起來這一切都很好,然後。如果使用gtk線程或使用標準線程模塊,這有什麼關係? –

+0

如果你有一個簡單的應用程序,一切都在一個單一的線程完成,那麼你沒事。如果您有一個GTK gui啓動或停止或需要響應其他線程的應用程序 - 然後使用GTK線程庫 - 它以非常類似的無縫方式工作。 –