2016-07-18 46 views
1

你好,我是新的Python和WebKit。 因此,我創建了一個簡單的Gtk應用程序,它在WebKit.WebView中加載一個Internet頁面列表,並且在加載頁面時會有一個DOM綁定來獲取該網站的標題。這是通過逐個加載站點的for循環發生的。但是在for循環的第一次運行中,該過程繞過了WebView.connect的'加載完成'信號並開始從列表的第二項獲取結果。 我想一些幫助PLZ ...WebKit.WebView信號問題for循環

# !/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() 

回答

0

你不能調用任何觸摸UI功能,無論是GTK +,WebKit的,或者沒有什麼,從一個單獨的線程。您必須從調用Gtk.main()的線程運行它們,也許使用GLib.idle_add()