如何将图像加载到 WebKit 浏览器中?

How do I load an image into a WebKit browser?

任务是实现一个可以打开任何文件的webkit浏览器。目前我只实现了html.

的开启
#!/usr/bin/env python3

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


def on_click(button):
    chooser = Gtk.FileChooserDialog(
        title="Open File", action=Gtk.FileChooserAction.OPEN
    )
    chooser.add_buttons(
        Gtk.STOCK_CANCEL,
        Gtk.ResponseType.CANCEL,
        Gtk.STOCK_OPEN,
        Gtk.ResponseType.OK,
    )
    chooser.set_default_response(Gtk.ResponseType.OK)
    if chooser.run() == Gtk.ResponseType.OK:
        filename = chooser.get_filename()
        chooser.destroy()
        f = open(filename)
        name, ext = os.path.splitext(filename)
        if ext == '.html':
            webview.load_html(f.read())
    else:
        chooser.destroy()


win = Gtk.Window()
win.connect("destroy", Gtk.main_quit)
win.set_border_width(10)
win.set_default_size(400, 200)

hb = Gtk.HeaderBar()
hb.set_show_close_button(True)
hb.props.title = "Browser"
win.set_titlebar(hb)

box = Gtk.HBox()
button = Gtk.Button(label="Open file")
button.connect("clicked", on_click)
box.add(button)
hb.pack_start(box)

webview = WebKit2.WebView()
win.add(webview)
win.show_all()
Gtk.main()

并尝试实现打开图片

#!/usr/bin/env python3

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


def on_click(button):
    chooser = Gtk.FileChooserDialog(
        title="Open File", action=Gtk.FileChooserAction.OPEN
    )
    chooser.add_buttons(
        Gtk.STOCK_CANCEL,
        Gtk.ResponseType.CANCEL,
        Gtk.STOCK_OPEN,
        Gtk.ResponseType.OK,
    )
    chooser.set_default_response(Gtk.ResponseType.OK)
    if chooser.run() == Gtk.ResponseType.OK:
        filename = chooser.get_filename()
        chooser.destroy()
        f = open(filename)
        name, ext = os.path.splitext(filename)
        pic_types = (
            '.jpg', '.jpeg', '.jfif', '.pjpeg', '.pjp',
            '.png', '.swg', '.webp'
            )


        image = Gtk.Image()
        image.set_from_file(filename)
        image.set_halign(Gtk.Align.START)
        image.set_valign(Gtk.Align.START)
        overlay.add_overlay(image)
        win.add(overlay)

    else:
        chooser.destroy()


win = Gtk.Window()
win.connect("destroy", Gtk.main_quit)
win.set_border_width(10)
win.set_default_size(400, 200)

hb = Gtk.HeaderBar()
hb.set_show_close_button(True)
hb.props.title = "Browser"
win.set_titlebar(hb)

box = Gtk.HBox()
button = Gtk.Button(label="Open file")
button.connect("clicked", on_click)
box.add(button)
hb.pack_start(box)

webview = WebKit2.WebView()
overlay = Gtk.Overlay()
overlay.add(webview)

win.show_all()
Gtk.main()

图片打不开,请问是什么原因?如何打开任何扩展名的文件?如果您使用放置在页面 html 标签中的文件,也许可以做到这一点?

你可以使用webview.load_uri()加载任何类型的文件,WebView自己会担心如何显示它。

因此,on_click() 应该是这样的:

def on_click(button):
    chooser = Gtk.FileChooserDialog(
        title="Open File", action=Gtk.FileChooserAction.OPEN
    )
    chooser.add_buttons(
        Gtk.STOCK_CANCEL,
        Gtk.ResponseType.CANCEL,
        Gtk.STOCK_OPEN,
        Gtk.ResponseType.OK,
    )
    chooser.set_default_response(Gtk.ResponseType.OK)
    if chooser.run() == Gtk.ResponseType.OK:
        filename = chooser.get_filename()
        chooser.destroy()

        # Use load_uri()
        webview.load_uri("file://" + filename)

    else:
        chooser.destroy()

请注意,您必须使用 "file://" + filename,因为这是浏览器知道您正在打开本地文件的方式。它的工作方式与 https:// 相同,因为它告诉浏览器如何处理 link; https:// 告诉浏览器该路径在网络上。

如果你在 Windows,你 可能 需要用 \ 替换每个 /,但我不能请确定,因为我不在 Windows.