在gtk和cmd中使用python线程可以吗?
我有一个脚本,是根据helloworld对gkt和cmd的修改编写的在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)
#!/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主循环移动到主线程,它工作得更好。出现了另一个问题,解决了这个问题。我接受了答案。