Webkit Download Sequenz

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Hallo,

ich bin gerade dabei mit Python, GTK, Webkit mir einen Browser zu basteln. Es läuft ganz gut, doch ich habe ein kleines Problem damit, Dateien runterzuladen.
Nach einigen Recherchen weiß ich, dass ich das das Signal download-requested verarbeiten muss, was ich so versucht habe:

Code: Alles auswählen

...        
    def __init__(self):
        self.web_view = webkit.WebView()
        self.web_view.connect('download-requested', self.download_requested)
...  
    def download_requested(view, download):
        name = download.get_suggested_filename()
        urlretrieve(download.get_uri(), '/home/malte/' + name)
        return False
        
 ...
Doch leider passiert gar nichts, auch keine Fehlermeldung im Terminal. Ich habe den PC auch nach temp Dateien abgesucht, auch nichts gefunden.
Könnt ihr mir sagen wo vielleicht ich einen Denkfehler habe?
Falls es gebraucht wird hier der ganze Code:

Code: Alles auswählen

#!/usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk
import webkit
import gobject
import yaml
import os

class Browser:
    
    with open(os.environ['HOME'] + "/.config/leaf/config.yml", 'r') as ymlfile:
        cfg = yaml.load(ymlfile)

    def delete_event(self, widget, event, data=None):
        return False

    def destroy(self, widget, data=None):
        gtk.main_quit()

    def download_requested(view, download):
        name = download.get_suggested_filename()
        urlretrieve(download.get_uri(), '/home/malte/' + name)
        return False

    def __init__(self):
        gobject.threads_init()
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_default_size(800, 600)
        self.window.set_resizable(True)
        self.window.set_title('Leaf Browser')
        self.window.set_icon_from_file('assets/leaf.png')
        self.window.connect("delete_event", self.delete_event)
        self.window.connect("destroy", self.destroy)

        self.web_view = webkit.WebView()
        self.web_view.connect('download-requested', self.download_requested)
        self.web_settings = webkit.WebSettings()

        self.web_settings.set_property('default-encoding', self.cfg['main']['default-encoding'])
        self.web_settings.set_property('user-agent', self.cfg['main']['user-agent'])

        self.web_settings.set_property('enable-private-browsing', self.cfg['security']['enable-private-browsing'])
        self.web_settings.set_property('enable-scripts', self.cfg['security']['javascript-enabled'])
        self.web_settings.set_property('enable-java-applet', self.cfg['security']['java-enabled'])
        self.web_settings.set_property('enable-display-of-insecure-content', self.cfg['security']['enable-display-of-insecure-content'])

        self.web_view.set_settings(self.web_settings)
        self.web_view.open(self.cfg['main']['homepage'])

        toolbar = gtk.Toolbar()

        self.back_button = gtk.ToolButton(gtk.STOCK_GO_BACK)
        self.back_button.connect("clicked", self.go_back)

        #same idea for forward button
        self.forward_button = gtk.ToolButton(gtk.STOCK_GO_FORWARD)
        self.forward_button.connect("clicked", self.go_forward)

        #again for refresh
        refresh_button = gtk.ToolButton(gtk.STOCK_REFRESH)
        refresh_button.connect("clicked", self.refresh)

        #add the buttons to the toolbar
        toolbar.add(self.back_button)
        toolbar.add(self.forward_button)
        toolbar.add(refresh_button)

        #entry bar for typing in and display URLs, when they type in a site
        #and hit enter the on_active function is called
        self.url_bar = gtk.Entry()
        self.url_bar.connect("activate", self.on_active)

        #anytime a site is loaded the update_buttons will be called
        self.web_view.connect("load_committed", self.update_buttons)

        scroll_window = gtk.ScrolledWindow(None, None)
        scroll_window.add(self.web_view)
        

        vbox = gtk.VBox(False, 0)
        vbox.pack_start(toolbar, False, True, 0)
        vbox.pack_start(self.url_bar, False, True, 0)
        vbox.add(scroll_window)

        self.window.add(vbox)
        self.window.show_all()

    def on_active(self, widge, data=None):
        url = self.url_bar.get_text()
        try:
            url.index("://")
        except:
            url = "http://"+url
        self.url_bar.set_text(url)
        self.web_view.open(url)

    def go_back(self, widget, data=None):
        self.web_view.go_back()

    def go_forward(self, widget, data=None):
        self.web_view.go_forward()

    def refresh(self, widget, data=None):
        self.web_view.reload()

    def update_buttons(self, widget, data=None):
        self.url_bar.set_text( widget.get_main_frame().get_uri() )
        self.back_button.set_sensitive(self.web_view.can_go_back())
        self.forward_button.set_sensitive(self.web_view.can_go_forward())

    def main(self):
        gtk.main()

if __name__ == "__main__":
    browser = Browser()
    browser.main()
Zuletzt geändert von Anonymous am Mittwoch 8. März 2017, 12:35, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@beli3ver: Bei `download_requested()` fehlt ja mindestens mal ein `self` oder ein `staticmethod()`-Decorator. Und da sollte auf der Konsole dann auch eine entsprechende Fehlermeldung ausgegeben werden werden.
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Ist doch:

Code: Alles auswählen

self.web_view.connect('download-requested', self.download_requested)
BlackJack

@beli3ver: Nicht dort, bei der Definition der der Methode die aufgerufen werdne soll.
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Ok, ich bin verwirrt, ich bekomme keinen Fehler:

Code: Alles auswählen

malte@DebLep:~/Entwicklung/Browser$ ./browser.py 
NOT SANDBOXED
malte@DebLep:~/Entwicklung/Browser$ 
Also müsste es dann so heißen?

Code: Alles auswählen

    def download_requested(self, view, download):
        name = download.get_suggested_filename()
        urlretrieve(download.get_uri(), '/home/malte/' + name)
        return False
BlackJack

@beli3ver: Ja. Oder ohne das `self` und mit einem `staticmethod()`-Dekorator weil das ja streng genommen gar keine Methode ist.
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Habe ich bereits versucht, weiterhin wird nichts runtergeladen, habe es mit einem ISO versucht, und es wird auch wieder keine Meldung ausgegeben.
BlackJack

Also ich bekomme beim Ausführen wenn ich versuche etwas herunter zu laden einen `NameError` weil `urlretrieve()` undefiniert ist. Bevor Du da was änderst, solltest Du es aber erst einmal auch zu dem `NameError` bringen, denn wenn Dir Fehlermeldungen nicht angezeit werden, dann wird Entwickeln und Fehlersuche sehr schwer. :-)
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Und wie bekomme ich das hin, das hin?
Soll ich es mit try und catch versuchen?

Habe jetzt ein

Code: Alles auswählen

import urllib2
versucht, hat auch nichts gebracht.
BlackJack

@beli3ver: Nach ``import urllib2`` ist der Name `urllib2` bekannt. `urlretrieve()` natürlich nicht auf magische weise. Du musst entweder den Namen explizit aus dem Modul importieren oder auf die Funktion über das Modul zugreifen.
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Ok, sorry Denkfehler:

Code: Alles auswählen

from urllib import urlretrieve
Weiter klappt es immer noch nicht, bekomme auch keine Fehlermeldungen angezeigt, weiß auch gerade nicht wie ich es hinbekomme, das mit die Fehlermeldungen angezeigt werden.
Antworten