Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带线程的PyGTK,gobject,从另一个线程发送信号?_Python_Multithreading_Webkit_Pygtk - Fatal编程技术网

Python 带线程的PyGTK,gobject,从另一个线程发送信号?

Python 带线程的PyGTK,gobject,从另一个线程发送信号?,python,multithreading,webkit,pygtk,Python,Multithreading,Webkit,Pygtk,我是Python新手,我想用pywebkitgtk打开一个网页(这里是google.com) 然后用另一个线程倒计时, 时间到了,向webview发送一个信号,将html作为文件下载 有没有办法在gtk.main中打开一个网页,在后台线程中倒计时,然后向GUI发送一个信号,让GUI做点什么 参考资料: 这是我的代码,它无法运行,我想我不理解Python的类 #!/usr/bin/env python import sys, threading import gtk, webkit impor

我是Python新手,我想用pywebkitgtk打开一个网页(这里是google.com)
然后用另一个线程倒计时,
时间到了,向webview发送一个信号,将html作为文件下载

有没有办法在gtk.main中打开一个网页,在后台线程中倒计时,然后向GUI发送一个信号,让GUI做点什么

参考资料:

  • 这是我的代码,它无法运行,我想我不理解Python的

    #!/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”对象没有属性“get\u html”


    我困惑了几天。。。谢谢

    看起来您对信号/对象和线程感到困惑_finished_加载方法没有将视图作为参数获取,因为您没有传递它。如果你让它全球化,它应该会起作用。下面的代码按预期工作

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