「GTK+3 」- 在 TextView 中,插入图片(学习笔记)

问题描述

该笔记将记录:在 GTK+ 3 中,如何使用 Pixbuf 向在 TextView 中插入图片

解决方案

使用 Python 实现

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
from gi.repository.GdkPixbuf import Pixbuf
import gi.repository.GdkPixbuf

class PluginInsertedObjectAnchor(Gtk.TextChildAnchor):

	def create_widget(self):
		return Gtk.Image.new_from_file("/usr/local/share/icons/d3rm/24x24-010editor.png")

	def dump(self, builder):
		attrib, data = self.objecttype.data_from_model(self.objectmodel)
		builder.start(OBJECT, dict(attrib)) # dict() because ElementTree doesn't like ConfigDict
		if data is not None:
			builder.data(data)
		builder.end(OBJECT)

class EditWindow(Gtk.Window):
	def __init__(self):
		# 创建 Window 控件
		Gtk.Window.__init__(self)
		self.set_default_size(200, 200)
		# 创建 TextView 控件
		textview = Gtk.TextView()
		textbuffer = textview.get_buffer()

		# 插入位置
		iter = textbuffer.get_iter_at_mark(textbuffer.get_insert())

		# 方法一、通过 Pixbuf 将图片插入 TextView 的 TextBuffer 中
		pixbuf = Pixbuf.new_from_file("/usr/local/share/icons/d3rm/24x24-010editor.png")
		textbuffer.insert_pixbuf(iter, pixbuf)

		# 方法二、通过 Anchor 插入
		anchor = textbuffer.create_child_anchor(iter)
		image = Gtk.Image.new_from_file("/usr/local/share/icons/d3rm/24x24-010editor.png")
		textview.add_child_at_anchor(image, anchor)

		# 方法三、自定义 Anchor 对象
		anchor = PluginInsertedObjectAnchor()  # 自定义 Anchor 对象
		textbuffer.insert_child_anchor(iter, anchor)  # 将 Anchor 添加到 TextBuffer 中
		textview.add_child_at_anchor(anchor.create_widget(), anchor)  # 向 Anchor 中添加控件

		# 将 TextView 加入 Window 中
		self.add(textview)

win = EditWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

注意事项:由于篇幅原因,我们将三种示例(方法一、方法二、方法三)放在一起。但是,它们三个是相互独立的,可单独使用。

参考文献

8.6. Inserting Child Widgets
13.3. Text Buffers
17. Multiline Text Editor — Python GTK+ 3 Tutorial 3.4 documentation
Gtk.Image – Classes – Gtk 3.0
Gtk.TextBuffer – Classes – Gtk 3.0
Gtk.TextBuffer · Python GTK+ 3 API
Gtk.TextIter · Python GTK+ 3 API
Gtk.TextView – Classes – Gtk 3.0
Gtk.TextView · Python GTK+ 3 API
How to get text buffer from file and loading into TextView using python and Gtk+3 – Ask Ubuntu