Webkit Download Sequenz

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

Webkit Download Sequenz

Beitragvon beli3ver » Mittwoch 8. März 2017, 12:32

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:

  1. ...        
  2.     def __init__(self):
  3.         self.web_view = webkit.WebView()
  4.         self.web_view.connect('download-requested', self.download_requested)
  5. ...  
  6.     def download_requested(view, download):
  7.         name = download.get_suggested_filename()
  8.         urlretrieve(download.get_uri(), '/home/malte/' + name)
  9.         return False
  10.        
  11.  ...


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:

  1. #!/usr/bin/env python
  2.  
  3. import pygtk
  4. pygtk.require('2.0')
  5. import gtk
  6. import webkit
  7. import gobject
  8. import yaml
  9. import os
  10.  
  11. class Browser:
  12.    
  13.     with open(os.environ['HOME'] + "/.config/leaf/config.yml", 'r') as ymlfile:
  14.         cfg = yaml.load(ymlfile)
  15.  
  16.     def delete_event(self, widget, event, data=None):
  17.         return False
  18.  
  19.     def destroy(self, widget, data=None):
  20.         gtk.main_quit()
  21.  
  22.     def download_requested(view, download):
  23.         name = download.get_suggested_filename()
  24.         urlretrieve(download.get_uri(), '/home/malte/' + name)
  25.         return False
  26.  
  27.     def __init__(self):
  28.         gobject.threads_init()
  29.         self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  30.         self.window.set_default_size(800, 600)
  31.         self.window.set_resizable(True)
  32.         self.window.set_title('Leaf Browser')
  33.         self.window.set_icon_from_file('assets/leaf.png')
  34.         self.window.connect("delete_event", self.delete_event)
  35.         self.window.connect("destroy", self.destroy)
  36.  
  37.         self.web_view = webkit.WebView()
  38.         self.web_view.connect('download-requested', self.download_requested)
  39.         self.web_settings = webkit.WebSettings()
  40.  
  41.         self.web_settings.set_property('default-encoding', self.cfg['main']['default-encoding'])
  42.         self.web_settings.set_property('user-agent', self.cfg['main']['user-agent'])
  43.  
  44.         self.web_settings.set_property('enable-private-browsing', self.cfg['security']['enable-private-browsing'])
  45.         self.web_settings.set_property('enable-scripts', self.cfg['security']['javascript-enabled'])
  46.         self.web_settings.set_property('enable-java-applet', self.cfg['security']['java-enabled'])
  47.         self.web_settings.set_property('enable-display-of-insecure-content', self.cfg['security']['enable-display-of-insecure-content'])
  48.  
  49.         self.web_view.set_settings(self.web_settings)
  50.         self.web_view.open(self.cfg['main']['homepage'])
  51.  
  52.         toolbar = gtk.Toolbar()
  53.  
  54.         self.back_button = gtk.ToolButton(gtk.STOCK_GO_BACK)
  55.         self.back_button.connect("clicked", self.go_back)
  56.  
  57.         #same idea for forward button
  58.         self.forward_button = gtk.ToolButton(gtk.STOCK_GO_FORWARD)
  59.         self.forward_button.connect("clicked", self.go_forward)
  60.  
  61.         #again for refresh
  62.         refresh_button = gtk.ToolButton(gtk.STOCK_REFRESH)
  63.         refresh_button.connect("clicked", self.refresh)
  64.  
  65.         #add the buttons to the toolbar
  66.         toolbar.add(self.back_button)
  67.         toolbar.add(self.forward_button)
  68.         toolbar.add(refresh_button)
  69.  
  70.         #entry bar for typing in and display URLs, when they type in a site
  71.         #and hit enter the on_active function is called
  72.         self.url_bar = gtk.Entry()
  73.         self.url_bar.connect("activate", self.on_active)
  74.  
  75.         #anytime a site is loaded the update_buttons will be called
  76.         self.web_view.connect("load_committed", self.update_buttons)
  77.  
  78.         scroll_window = gtk.ScrolledWindow(None, None)
  79.         scroll_window.add(self.web_view)
  80.        
  81.  
  82.         vbox = gtk.VBox(False, 0)
  83.         vbox.pack_start(toolbar, False, True, 0)
  84.         vbox.pack_start(self.url_bar, False, True, 0)
  85.         vbox.add(scroll_window)
  86.  
  87.         self.window.add(vbox)
  88.         self.window.show_all()
  89.  
  90.     def on_active(self, widge, data=None):
  91.         url = self.url_bar.get_text()
  92.         try:
  93.             url.index("://")
  94.         except:
  95.             url = "http://"+url
  96.         self.url_bar.set_text(url)
  97.         self.web_view.open(url)
  98.  
  99.     def go_back(self, widget, data=None):
  100.         self.web_view.go_back()
  101.  
  102.     def go_forward(self, widget, data=None):
  103.         self.web_view.go_forward()
  104.  
  105.     def refresh(self, widget, data=None):
  106.         self.web_view.reload()
  107.  
  108.     def update_buttons(self, widget, data=None):
  109.         self.url_bar.set_text( widget.get_main_frame().get_uri() )
  110.         self.back_button.set_sensitive(self.web_view.can_go_back())
  111.         self.forward_button.set_sensitive(self.web_view.can_go_forward())
  112.  
  113.     def main(self):
  114.         gtk.main()
  115.  
  116. if __name__ == "__main__":
  117.     browser = Browser()
  118.     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

Re: Webkit Download Sequenz

Beitragvon BlackJack » Mittwoch 8. März 2017, 12:48

@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: 13
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Re: Webkit Download Sequenz

Beitragvon beli3ver » Mittwoch 8. März 2017, 13:05

Ist doch:

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

Re: Webkit Download Sequenz

Beitragvon BlackJack » Mittwoch 8. März 2017, 13:33

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

Re: Webkit Download Sequenz

Beitragvon beli3ver » Mittwoch 8. März 2017, 14:07

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?

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

Re: Webkit Download Sequenz

Beitragvon BlackJack » Mittwoch 8. März 2017, 14:40

@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: 13
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Re: Webkit Download Sequenz

Beitragvon beli3ver » Mittwoch 8. März 2017, 14:49

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

Re: Webkit Download Sequenz

Beitragvon BlackJack » Mittwoch 8. März 2017, 15:09

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: 13
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Re: Webkit Download Sequenz

Beitragvon beli3ver » Mittwoch 8. März 2017, 15:49

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

Habe jetzt ein

  1. import urllib2


versucht, hat auch nichts gebracht.
BlackJack

Re: Webkit Download Sequenz

Beitragvon BlackJack » Mittwoch 8. März 2017, 16:00

@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: 13
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Re: Webkit Download Sequenz

Beitragvon beli3ver » Mittwoch 8. März 2017, 16:16

Ok, sorry Denkfehler:

  1. 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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder