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
...
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()