在gtk和cmd中使用python线程可以吗?

在gtk和cmd中使用python线程可以吗?,python,multithreading,cmd,gtk,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)

我有一个脚本,是根据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命令时,按钮被设置。单击按钮时,会打印“发生了什么事”。命令行继续运行,就好像没有发生异常情况一样。我真的很惊讶这一切是如此无缝。但是我还是有点担心。

GTK有自己的线程库,我认为在复杂的应用程序中,您需要小心:-例如,当您有线程独立于主线程更新GUI时


在您的示例中,您确实有一个线程应用程序,尽管事实上整个GTK应用程序都在一个线程中运行-因此您可以。

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


  • 看起来一切都很好。使用gtk线程或标准线程模块有关系吗?如果您有一个简单的应用程序,所有事情都在一个线程中完成,那么您就可以了。如果您有一个GTK gui启动或停止或需要响应其他线程的应用程序-然后使用GTK线程库-它以一种非常相似的无缝方式工作。这只是保持执行有序的问题吗?就像某个线程正在运行,但其他一些必需的数据还没有从另一个线程生成?我尝试将Gtk主循环移动到主线程,它工作得更好。出现了另一个问题,解决了这个问题。我接受了答案。