2016-07-18 6 views
1

Hallo ich bin neu in Python und WebKit. Also habe ich eine einfache Gtk-App erstellt, die in einer WebKit.WebView eine Liste von Internet-Seiten lädt und wenn eine Seite geladen wird, gibt es eine DOM-Bindung, um den Titel der Website zu übernehmen. Dies geschieht durch eine for-Schleife, die die Standorte nacheinander lädt. Aber beim ersten Durchlauf der for-Schleife überbrückt der Prozess das Signal 'Laden beendet' von WebView.connect und beginnt, Ergebnisse von dem zweiten Element der Liste zu erhalten. ich etwas Hilfe möchte plz ...Problem mit WebKit.WebView Signale in for Schleife

# !/usr/bin/python 
# -*- coding: UTF-8 -*- 
import threading 
from time import sleep 
import gi 
gi.require_version('WebKit', '3.0') 
gi.require_version("Gtk", "3.0") 
from gi.repository import Gtk, WebKit 



source = ["http://imdb.com", "http://cnn.com", 
      "http://wikipedia.org", "http://nokia.com"] 


class MainWindow(Gtk.Window): 
    def __init__(self): 
     Gtk.Window.__init__(self) 
     self.set_border_width(10) 
     self.set_default_size(1024, 768) 
     self.notebook = Gtk.Notebook() 
     self.add(self.notebook) 

     self.page1 = Gtk.Box() 
     self.page1.set_border_width(10) 
     self.page1.set_margin_left(5) 
     self.page1.set_margin_right(5) 
     self.page1.set_margin_top(5) 
     mainbox = Gtk.Box() 
     box1 = Gtk.VBox() 
     box2 = Gtk.Box() 
     buttoncall = Gtk.Button("Start") 
     buttoncall.connect('clicked', self.help) 
     buttoncall.set_size_request(50, 50) 
     scrolled = Gtk.ScrolledWindow() 
     scrolled.set_border_width(10) 
     scrolled.set_size_request(300, 300) 
     scrolled.set_policy(Gtk.PolicyType.ALWAYS, Gtk.PolicyType.ALWAYS) 
     self.web1 = WebKit.WebView() 
     self.web1.set_editable(False) 
     self.web1.load_uri("") 
     scrolled.add(self.web1) 
     box1.pack_start(buttoncall, False, False, 10) 
     mainbox.pack_start(box1, False, False, 0) 
     mainbox.pack_start(box2, True, True, 0) 
     box1.add(scrolled) 
     self.page1.pack_start(mainbox, True, True, 0) 
     self.notebook.append_page(self.page1, Gtk.Label("Search info")) 

    def get_source(self): 
     print("enterded source") 
     html = self.web1.get_main_frame().get_title() 
     return html 

    def help(self, widget): 
     threading.Thread(target=self.start_it, args=(widget)).start() 

    def start_it(self,widget): 

     for i in range(len(source)): 
      print(source[i]) 
      self.web1.load_uri(source[i]) 
      while (int(self.web1.get_load_status() != 2)): 
       sleep(0.5) 
       print("loading page") 
      self.web1.connect('load-finished', self.finished_load) 


    def finished_load(self, web1, frame): 
     print("get finished") 
     c = self.get_source() 
     print(c) 




window = MainWindow() 
window.connect("delete-event", Gtk.main_quit) 
window.show_all() 
Gtk.main() 

Antwort

0

Sie keine Funktionen, die jede UI berühren aufrufen können, sei es GTK +, WebKit, oder das, was von einem separaten Thread nicht. Sie müssen sie aus dem Thread ausführen, der Gtk.main() aufruft, möglicherweise unter Verwendung von GLib.idle_add().