我有一个脚本,我写的是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命令时,按钮被设置。点击按钮后发生了一些事情'打印。命令行继续,好像没有任何异常发生。我真的很惊讶它的无缝性。但我仍然有点担心。
答案 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]。