使用gtk和cmd的python线程吗?

时间:2014-07-14 03:37:51

标签: python multithreading cmd gtk

我有一个脚本,我写的是helloworld对gkt和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()

这很有效。我想知道的是这样吗?有什么问题需要注意吗?这是我第一次尝试这个,所以对我来说有很多未知数。我知道cmd和gtk都是阻塞的。到目前为止,Gtk.main和cmd循环完美无缺。我只是保持谨慎。

我第一次使用线程。当cmd获取setbutton命令时,按钮被设置。点击按钮后发生了一些事情'打印。命令行继续,好像没有任何异常发生。我真的很惊讶它的无缝性。但我仍然有点担心。

2 个答案:

答案 0 :(得分:1)

GTK有它的'拥有自己的线程库,你需要小心我认为复杂的应用程序:http://faq.pygtk.org/index.py?req=show&file=faq20.006.htp - 例如当你有线程独立于主线程更新你的GUI时。

在您的示例中,您确实有一个线程应用程序,但实际上您的整个GTK应用程序都在一个线程中运行 - 所以您没问题。

答案 1 :(得分:0)

GTK +不是线程安全的,并且该示例存在一些可能导致不稳定的问题。该示例在主线程中加载GTK +,在另一个线程中运行GTK +主循环,并在另一个线程中创建GTK +小部件。所有GTK + API调用都应该发生在主线程中,其他线程通过添加空闲或定时器回调来回传到主GUI线程。阅读PyGObject线程维基[1]。

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