2016-03-18 74 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。