Python: WebKit.WebView: как перезагрузить при ошибке? - PullRequest
1 голос
/ 22 апреля 2019

Я недавно задал этот вопрос , на который ответил . Я пытаюсь точно так же, но с WebKit.WebView с GTK, и я застрял в той же части.

Цель: Загрузить другой URL-адрес, если первый недоступен.

import gi, time
gi.require_version('Gtk', '3.0')
gi.require_version('WebKit', '3.0')
from gi.repository import Gtk, WebKit

browser = WebKit.WebView()
browser.load_uri('http://this-domain-does-not-exist.tld')

def load_error(webview, event, url, error):
  webview.load_uri('http://google.com') # not working

browser.connect('load-error', load_error)

win = Gtk.Window()
win.add(browser)
win.show_all()
Gtk.main()

Есть идеи? Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Я заработал, переместившись в WebKit2 и вернув True в обратном вызове. Возможно, что только возврат работает для WebKit, но у меня нет этого для тестирования. Модифицированный код:

import gi
gi.require_version('Gtk', '3.0')
gi.require_version('WebKit2', '4.0')
from gi.repository import Gtk, WebKit2

browser = WebKit2.WebView()
browser.load_uri('http://this-domain-does-not-exist.tld')

def load_failed(webview, event, url, error):
    webview.load_uri('http://google.com')
    return True

browser.connect('load-failed', load_failed)  # Changed from load-error

win = Gtk.Window()
win.connect("destroy", Gtk.main_quit)
win.add(browser)
win.show_all()
Gtk.main()

Из документации :

Returns: True, чтобы остановить вызов других обработчиков для события. Неверно распространять событие дальше.

1 голос
/ 22 апреля 2019

По некоторым причинам команды, которые выполняются в функции обратного вызова с ошибкой, игнорируются.Исправление заключается в добавлении резервной загрузки URI после обработки всех других событий.Как это:

from gi.repository import Gtk, WebKit, GLib

....

def load_error(webview, event, url, error):
    GLib.idle_add(webview.load_uri, 'http://google.com')
...