2012-06-17 16 views
6

Estoy tratando de cargar una vista de webkit en un hilo diferente al hilo principal de gtk.Webkit threads with PyGObject en Gtk3

que ver el ejemplo PyGTK, Threads and WebKit

que modificar ligeramente para PyGObject apoyo y GTK3:

from gi.repository import Gtk 
from gi.repository import Gdk 
from gi.repository import GObject 
from gi.repository import GLib 
from gi.repository import WebKit 
import threading 
import time 

# Use threads          
Gdk.threads_init() 

class App(object): 
    def __init__(self): 
     window = Gtk.Window() 
     webView = WebKit.WebView() 
     window.add(webView) 
     window.show_all() 

     #webView.load_uri('http://www.google.com') # Here it works on main thread 

     self.window = window 
     self.webView = webView 

    def run(self): 
     Gtk.main() 

    def show_html(self): 
     print 'show html' 

     time.sleep(1) 
     print 'after sleep' 

     # Update widget in main thread    
     GLib.idle_add(self.webView.load_uri, 'http://www.google.com') # Here it doesn't work 

app = App() 

thread = threading.Thread(target=app.show_html) 
thread.start() 

app.run() 
Gtk.main() 

El resultado es una ventana vacía y "después de dormir" impresión nunca se ejecuta. La llamada idle_add no funciona. La única parte de trabajo es la llamada comentada en el hilo principal.

Respuesta

6

Necesito GLib.threads_init() antes de gdk's.

Al igual que este:

from gi.repository import Gtk 
from gi.repository import Gdk 
from gi.repository import GObject 
from gi.repository import GLib 
from gi.repository import WebKit 
import threading 
import time 

# Use threads          
GLib.threads_init() 

class App(object): 
    def __init__(self): 
     window = Gtk.Window() 
     webView = WebKit.WebView() 
     window.add(webView) 
     window.show_all() 

     #webView.load_uri('http://www.google.com') # Here it works on main thread 

     self.window = window 
     self.webView = webView 

    def run(self): 
     Gtk.main() 

    def show_html(self): 
     print 'show html' 

     time.sleep(1) 
     print 'after sleep' 

     # Update widget in main thread    
     GLib.idle_add(self.webView.load_uri, 'http://www.google.com') # Here it doesn't work 

app = App() 

thread = threading.Thread(target=app.show_html) 
thread.start() 

app.run() 
Gtk.main()