我需要能够显示图像和文本(图像可调整大小,文本可编辑)。我在想也许 HTML 类型的东西可以做到这一点。举一个非常糟糕的例子,比如文字处理器的工作原理。输入和编辑文本以及粘贴和编辑图像。
提前致谢,对于这个对我来说不可能完成的任务,深表抱歉。
编辑:我也希望能够以某种方式保存它。
答案1
实际上,您可以使用 TextView 小部件来执行此操作。首先,您应该将 editable 设置为 true:
textview.set_editable(true)
您将需要获取其文本缓冲区,即文本视图数据:
buffer = textview.get_buffer()
然后使用该缓冲区,您可以获取并设置其中的数据。要获取缓冲区中当前的文本,请使用:
buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter(), false)
第一个和第二个参数是获取文本的范围,在本例中为全部文本。最后一个参数指定是否要获取隐藏字符,在本例中为 false。要插入文本,您可以使用以下命令:
buffer.insert(buffer.get_end_iter(), "Sample text")
第一个参数指定插入文本的位置,在本例中是在末尾。第二个参数是要插入的文本。要替换缓冲区中的所有数据,您可以使用:
buffer.set_text("Sample text")
这将用“示例文本”替换缓冲区中的所有内容。要插入图像,您需要创建一个 pixbuf 来执行此操作,请使用以下命令:
pixbuf = gtk.gdk.pixbuf_new_from_file(filename)
要调整 pixbuf 的大小,请使用:
pixbuf.scale_simple(dest_width, dest_height, gtk.gdk.INTERP_BILINEAR)
前两个参数是新的宽度和高度,第三个参数是插值类型,控制其如何缩放(有四种类型可以找到这里)然后你可以使用以下命令将此 pixbuf 添加到缓冲区:
buffer.insert_pixbuf(buffer.get_end_iter(), pixbuf)
这将在缓冲区的末尾插入一个图像。
您还可以执行诸如添加小部件、设置边距、从剪贴板复制和粘贴、在光标处插入等操作,但您可以查看下面的链接。
编辑:对于格式化的保存/加载,您可以使用 textbuffers 序列化方法。首先,您应该使用它的 register_serialize_tagset() 方法:
format = buffer.register_serialize_tagset()
接下来就可以使用它的serialize方法来获取序列化的数据:
data buffer.serialize(buffer, format, buffer.get_start_iter(), buffer.get_end_iter())
这将返回 textbuffer 内部格式的数据,您可以将其保存到文件中。要加载此数据,首先调用 textbuffer 的 register_deserialize_tagset() 方法:
format = emptyBuffer.register_deserialize_tagset()
然后您可以使用其 deserialize() 方法加载数据:
emptyBuffer.deserialize(emptyBuffer, format, emptyBuffer.get_end_iter(), data)
这会将数据加载到文本缓冲区中。
編輯2:如果您希望用户能够通过拖动来移动和调整大小,则必须将 pixbuf 加载到图像小部件中,将图像小部件加载到事件框中,将事件框加载到子锚点中,然后放入文本视图中,您可以处理该小部件的 x 事件,并在处理程序中编写代码来移动或调整图像大小。
资源: