2014-02-24 94 views
0

我是新來的Python,我想用pywebkitgtk
然後用另一個線程倒計時打開一個網頁(這裏是google.com),
當時間到了,將信號發送到網頁視圖,下載HTML作爲文件PyGTK與線程,gobject,從另一個線程發送信號?

有沒有辦法來打開gtk.main並在後臺線程倒計時網頁,然後將信號發送到圖形用戶界面,使界面做一些事情..

參考材料:

  1. Downloading a page’s content with python and WebKit
  2. using a separate thread to run code, two approaches for threads in PyGTK.

這裏是我的代碼,它不能運行,我想我不明白Python的Class ...

#!/usr/bin/env python 
import sys, threading 
import gtk, webkit 
import time 
import gobject 

gobject.threads_init() 
google = "http://www.google.com" 

class WebView(webkit.WebView): 
    #return page's content 
    def get_html(self): 
     self.execute_script('oldtitle=document.title;document.title=document.documentElement.innerHTML;') 
    html = self.get_main_frame().get_title() 
    self.execute_script('document.title=oldtitle;') 
    return html 

#wait 5 senconds and send a signal 
class TimeSender(gobject.GObject, threading.Thread): 
    def __init__(self): 
     self.__gobject_init__() 
     threading.Thread.__init__(self) 

    def run(self): 
     print "sleep 5 seconds" 
     time.sleep(5) 
     self.emit("Sender_signal") 

gobject.type_register(TimeSender) 
gobject.signal_new("Sender_signal", TimeSender, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,()) 

#PywebkitGTK, open google.com, receive signal 
class Window(gtk.Window, gobject.GObject): 
    def __init__(self, time_sender, url): 
     self.__gobject_init__() 
     gtk.Window.__init__(self) 
     time_sender.connect('Sender_signal', self._finished_loading) 
     self._url = url 

    def open_page(self): 
     view = WebView() 
     view.get_html() 
     view.open(self._url) 
     self.add(view) 
     gtk.main() 
    #write html to file 
    def _finished_loading(self, view): 
     with open("pagehtml.html", 'w') as f: 
      f.write(view.get_html()) 
     gtk.main_quit() 

''' 
def user_callback(object): 
    with open("pagehtml2.html", 'w') as f: 
     f.write(view.get_html()) 
    gtk.main_quit() 
''' 

if __name__ == '__main__': 
    time_sender = TimeSender() 
    window = Window(time_sender, google) 
    #time_sender.connect("Sender_signal", user_callback) 
    time_sender.start() 
    window.open_page() 

我得到了一個錯誤:
AttributeError: 'TimeSender' object has no attribute 'get_html'
我一直困惑了幾天......謝謝

回答

0

看起來你對信號/對象和線程感到困惑。 _finished_loading方法不會將視圖作爲參數,因爲喲沒有傳遞它。如果你把它變成全球性的,它應該可行。以下代碼可按預期工作。

#!/usr/bin/env python 
import sys, threading 
import gtk, webkit 
import time 
import gobject 

gobject.threads_init() 
google = "http://www.google.com" 

class WebView(webkit.WebView): 
    #return page's content 
    def get_html(self): 
     self.execute_script('oldtitle=document.title;document.title=document.documentElement.innerHTML;') 
     html = self.get_main_frame().get_title() 
     self.execute_script('document.title=oldtitle;') 
     return html 

#wait 5 senconds and send a signal 
class TimeSender(gobject.GObject, threading.Thread): 
    def __init__(self): 
     self.__gobject_init__() 
     threading.Thread.__init__(self) 

    def myEmit(self): 
     window.emit("Sender_signal") 

    def run(self): 
     print "sleep 5 seconds" 
     time.sleep(5) 
     gobject.idle_add(self.myEmit) 


gobject.type_register(TimeSender) 

#PywebkitGTK, open google.com, receive signal 
class Window(gtk.Window, gobject.GObject): 
    def __init__(self, time_sender, url): 
     self.__gobject_init__() 
     gtk.Window.__init__(self) 
     self.connect('Sender_signal', self._finished_loading) 
     self._url = url 

    def open_page(self): 
     self.view = WebView() 
     self.view.get_html() 
     self.view.open(self._url) 
     self.add(self.view) 
     gtk.main() 
    #write html to file 
    def _finished_loading(self, view1): 
     with open("pagehtml.html", 'w') as f: 
      f.write(self.view.get_html()) 
     gtk.main_quit() 

''' 
def user_callback(object): 
    with open("pagehtml2.html", 'w') as f: 
     f.write(view.get_html()) 
    gtk.main_quit() 
''' 

if __name__ == '__main__': 
    gobject.signal_new("Sender_signal", Window, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,()) 
    time_sender = TimeSender() 
    window = Window(time_sender, google) 
    #time_sender.connect("Sender_signal", user_callback) 
    time_sender.start() 
    window.open_page()