gtk-builder-error-quark: недопустимый тип объекта 'WebKitWebView' - PullRequest
1 голос
/ 08 февраля 2020

Я получаю следующую ошибку при попытке получить WebKitWebView объект через Gtk.builder():

$ python3 test.py
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    builder.add_from_file("ui.glade")
gi.repository.GLib.Error: gtk-builder-error-quark: ui.glade:31:1 Invalid object type 'WebKitWebView' (6)

Вот мой Python код

#!/usr/bin/env python

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

from gi.repository import Gtk
from gi.repository import WebKit2 as Webkit

builder = Gtk.Builder()
builder.add_from_file("ui.glade")

window = builder.get_object("window")
window.set_title("Test")

webview = builder.get_object("webview")

if __name__ == "__main__": 
  window.show_all()
  Gtk.main()

А вот мой ui.glade file:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <requires lib="webkit2gtk" version="2.12"/>
  <object class="GtkWindow" id="window">
    <property name="width_request">800</property>
    <property name="height_request">600</property>
    <property name="can_focus">False</property>
    <child>
      <placeholder/>
    </child>
    <child>
      <object class="GtkBox">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkEntry">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="WebKitWebView" id="webview">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <child>
              <placeholder/>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

Есть похожий вопрос здесь , но я, честно говоря, не "понял", как сказал ответ.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2020

Вопрос : gtk-builder-error-quark: неверный тип объекта 'WebKitWebView'

Кажется, это scope and namespace проблема, которая Gtk.Builder не могу решить.

Нашел это простое решение, чтобы ввести требуемые классы WebKit2.WebView и WebKit2.Settings в модуль namespace.

Примечание: Вам не нужно ничего менять в Glade, размещать WebKit2 объекты как обычно .

Изменить import от

from gi.repository import WebKit2 as Webkit

до

from gi.repository.WebKit2 import WebView, Settings

Если вы не хотите определять используемые классы один за другим , рассмотрим это по запросу решение.

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


class GtkBuilder(Gtk.Builder):
    def do_get_type_from_name(self, type_name):
        """
        Looks up a type by name, using the virtual function that Gtk.Builder 
        has for that purpose.

        Parameters:  type_name (str) – type name to lookup
        Returns:     the GObject.GType found for type_name 
                       or GObject.TYPE_INVALID if no type was found
        Return type: GObject.GType

        """

        if type_name.startswith('WebKit'):
            getattr(Webkit, type_name[6:])

        r = Gtk.Builder.do_get_type_from_name(self, type_name)
        print('GtkBuilder: => {}\t{}'.format(type_name, r))
        return r

Выход :

GtkBuilder: => WebKitSettings   <GType WebKitSettings (4168054944)>
GtkBuilder: => GtkWindow    <GType GtkWindow (4167639152)>
GtkBuilder: => GtkBox   <GType GtkBox (4167624432)>
GtkBuilder: => GtkEntry <GType GtkEntry (4168904384)>
GtkBuilder: => WebKitWebView    <GType WebKitWebView (4168054192)>

Протестировано с Python: 3,5 - ги .__ версия__: 3.22.0 - Поляна 3,22,1

2 голосов
/ 08 февраля 2020

Проблема

Существует ошибка, из-за которой gtk_builder_get_type_from_name не работает с WebKitWebView.

Проблема в том, что он ищет символ web_kit_web_view_get_type, когда это должно искать webkit_web_view_get_type. Это неудачно. Я не уверен, что с этим делать.

Обходной путь: вручную зарегистрируйте тип перед созданием GtkBuilder. Должно работать что-то вроде g_object_unref (g_object_ref_sink (webkit_web_view_new ())).

см. https://bugs.webkit.org/show_bug.cgi?id=175937

Существует несколько возможных решений.

Обходной путь 1

Одним из решений может быть создание веб-представления в коде

webview = Webkit.WebView()

В файле ui.glade замените WebKitWebView на GtkScrolledWindow, возможно, более подходящим является идентификатор типа scrolled_window. Для свойства expand должно быть установлено значение True.

После прочтения файла glade вы можете сделать следующее:

scrolled_window = builder.get_object("scrolled")
scrolled_window.add_with_viewport(webview)

webview.load_uri("https://www.google.com")

Обходной путь 2

В качестве альтернативы, вы можете просто позвонить (сам вызов достаточен, вам не нужно присваивать его переменной) перед вызовом Gtk.Builder ():

Webkit.WebView() 

Это эквивалентно вышеупомянутому обходному пути из связанного отчета об ошибках с вызовом webkit_web_view_new ().

Однако для свойства expand должно быть установлено значение True для WebKitWebView в файле ui.glade.

Демо

В Ubuntu это выглядело бы так в обоих случаях:

Demo Webkit.WebView

...