2016-03-18 48 views
0

我需要打开我的主窗口的功能,并保持这个功能运行,因为它检查一些状态(它是again()函数,我删除了这个例子中的检查)。此功能必须保持原样。但主窗口挂起。请帮忙。python主窗口挂起计时器

# -*- coding: utf-8 -*- 
import pygtk 
pygtk.require("2.0") 
import gtk 
import gobject 
import time 
gtk.gdk.threads_init() 

class App: 
    def __init__(self): 
     self.okno = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.okno.resize(400,150) 
     self.okno.show_all() 

     self.again() 


    def again(self): 
     i=0 
     while 1: 
      print i 
      i=i+1   

if __name__ == "__main__": 
    app = App() 
    gtk.threads_enter() 
    gtk.main() 
    gtk.threads_leave() 

更改:

# -*- coding: utf-8 -*- 
import pygtk 
pygtk.require("2.0") 
import gtk 
import gobject 
import time 
import threading, sys 

gtk.gdk.threads_init() 

class App(threading.Thread): 
    def __init__(self): 
     self.okno = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.okno.resize(400,150) 
     self.okno.show_all() 
     self.again()   

    def again(self): 
     i=0 
     while 1: 
      print i 
      sys.stdout.flush() 
      i=i+1  
      time.sleep(1) 

if __name__ == "__main__": 
    gtk.threads_enter() 
    threading.Thread(target=App).start() 
    gtk.threads_leave() 
    gtk.main() 
+0

您没有正确使用线程。你应该在'app = App()'和'gtk.threads_leave()'后面说'gtk.threads_enter()'。然而,你甚至不使用线程,所以你还应该把'app = App()'改为'threading.Thread(target = App).start()'。你需要导入'线程'。 – zondo

+0

Zondo,谢谢。我改变了我的代码,但它没有按预期工作。我错过了什么吗? – peter

+0

这可能只是打印一些没有暂停*和*处理窗口事件的东西太多了,无法处理。 – zondo

回答

1

可以从不同的线程不使用GTK API;只有一个线程被允许使用GTK,并且它是调用Gtk.main()的线程(并初始化库,当您导入Gtk模块时,由Python绑定自动完成)。

与GTK一起使用线程的正确方法是创建一个工作线程来执行长时间运行的任务,并且无论何时UI需要更新,您都应该使用GLib.idle_add()在主循环中安排一个回调。您传递给idle_add()函数的调用保证在与运行主循环的线程相同的线程中调用。

如果您使用工作线程(并且这些函数无法移植;它们已在GTK 3.0中弃用),则不需要使用threads_enter()threads_leave() API。