python主窗口挂起计时器

时间:2016-03-18 14:22:50

标签: python multithreading python-2.7 gtk pygtk

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

# -*- 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()

CHANGED:

# -*- 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()

1 个答案:

答案 0 :(得分:1)

不能使用来自不同线程的GTK API;只允许一个线程使用GTK,并且它是调用Gtk.main()的线程(并初始化了库,这是在导入Gtk模块时由Python绑定自动完成的。)

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

如果您使用工作线程,则不需要使用threads_enter()threads_leave() API(并且这些功能无论如何都不可移植;它们已在GTK 3.0中弃用)。< / p>