2016-07-26 30 views
6

Ich habe meine Ansicht erstellt (in einem Fenster eingewickelt) und eine URL wie folgt geladen:Wie behandelt man Klicks auf Links in Python mit Gtk 3.0 und WebKit2 4.0?

self.web_view = WebKit2.WebView() 
self.web_view.load_uri("https://en.wikipedia.org") 

Mein „Mini-Browser“ startet und ich kann auf lokale Links (Links klicken, die JavaScript-Ereignisse gebunden sind, oder Links zu anderen Seiten derselben Domain). Aber wenn die Links auf andere Domains zeigen, passiert nichts. Wie finde ich Klicks auf externe Links? Oder wie kann ich diese Links im Standardbrowser des Systems öffnen?

UPDATE: Cross-Site-Links werden nicht vom "Mini-Browser" verarbeitet. Kann ich einen Ereignis-Hook (onclick) schreiben, um den "Mini-Browser" zu unterbrechen und basierend auf einer benutzerdefinierten Logik zu handeln oder gibt es eine Möglichkeit, Cross-Site-Links zu konfigurieren.

+0

Sie verwenden das Standard-Webkit? Es gibt ein Python-basiertes Webkit für gtk: [pywebkitgtk] (https://code.google.com/archive/p/pywebkitgtk), möglicherweise funktioniert es besser als das Standard-Python-webkit2. [Hier] (https://stackoverflow.com/questions/647041/need-a-simple-hello-world-example-using-the-webkit-library-in-python) ist ein Anwendungsbeispiel – Alex

+0

Hier ein [Beispiel von einem Python-Browser] (https://gist.github.com/kklimonda/890640#file-pybrowser-py), die gtk und webkit verwendet, habe ich nur einen Versuch unternommen, "https: // en.wikipedia.org" ist für mich arbeiten. Grundsätzlich werden die gleichen Anrufe wie du benutzt .. du erben auch von 'Gtk.VBox'? – Alex

+1

@Alex Das Beispiel basiert auf der alten Version von gtk und webkit :-( – Witek

Antwort

2

Haben Sie eine GtkLinkButton verwendet? Nach dem doc von gtk-show-uri, die den Standard-Browser verwendet Links zu öffnen, müssen Sie zusätzlich die gvfs installieren erhalten Unterstützung für uri Systeme wie http:// oder ftp://

für Debian-basierte Distributionen können Sie gvfs einfach so installieren:

sudo apt-get install gvfs gvfs-backends gvfs-fuse

Wenn das, zusätzlich die Fehlermeldung von gtk_show_uri überprüfen kann nicht helfen, falls es FALSCH

bei Sonderanfertigungen Browser zurückgibt, wie Ihre, nach dem Dokument GtkLinkButton müssen Sie mit dem activate-link signal verbinden und True vom Handler zurückgeben ... wahrscheinlich haben Sie das schon getan.

+0

Gibt es eine Dokumentation, wie GtkLinkButton von Python zu verwenden? – Witek

+0

[Hier ist das offizielle gtk python doc] (https://developer.gnome.org/pygtk/stable/class-gtklinkbutton.html) für den Link-Button und [hier] (http: // python-gtk-3 -tutorial.readthedocs.io/en/latest/button_widgets.html) ist ein Tutorial, das auch Python-Snippets für den Link-Button zur Verfügung stellt. – Alex

+0

Jetzt verstehe ich es nicht. Wofür verwende ich den LinkButton? Ich brauche die Links in meinem WebView zu arbeiten ... – Witek

0

Die GtkLinkButton Antwort ist wirklich falsch, denn das hat überhaupt nichts mit GtkLinkButton zu tun und WebKit verwendet nicht gvfs, um Links zu laden.

Ich weiß nicht, warum Cross-Domain-Links nicht für Sie arbeiten. Sie sollten standardmäßig funktionieren. Sie können dieses Verhalten mithilfe des Signals WebKitWebView::decide-policy steuern, aber die Standardrichtlinie sollte den Link öffnen.

Sie haben in Ihrem Kommentar erwähnt, dass Sie Probleme mit Links mit Ziel _blank hatten. Ist es möglich, dass dies die einzigen domänenübergreifenden Links waren, die Sie getestet haben? Das Problem ist einfach: WebKit kann nicht automatisch neue Fenster für Sie öffnen, Sie müssen den Code dafür schreiben. Zum Glück ist es ziemlich einfach: Verbinden Sie sich mit WebKitWebView::create und folgen Sie der Dokumentation dort. Sie müssen im Grunde ein neues GtkWindow erstellen, ein verwandtes WebKitWebView erstellen, die neue Ansicht in das Fenster packen, eine Verbindung zu WebKitWebView::ready-to-show in der neuen Ansicht herstellen und das Fenster anzeigen, wenn dieses Signal ausgegeben wird.