2012-06-17 15 views
6

Próbuję załadować widok webkita na inny wątek niż główny wątek dla gtk.Nici w sieci Web z PyGObject na Gtk3

widzę przykładzie PyGTK, Threads and WebKit

ja lekko zmodyfikować dla PyGObject wsparcia i 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() 

Rezultatem jest puste okno i „uśpienia” po druku nie jest wykonywany. Wywołanie idle_add nie działa. Jedyną częścią roboczą jest wywołanie komentarza do głównego wątku.

Odpowiedz

6

Potrzebuję GLib.threads_init() przed gdk.

Właśnie tak:

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() 
Powiązane problemy