1

我想编写一个 Python 应用程序,它使用 GTK(通过gi.repository)来显示大量数据的文本视图。(具体来说,程序中的反汇编指令,类似于 IDA 显示的。)

我认为这应该相当简单:使用普通的 GtkTextView 和 GtkTextBuffer 的自定义子类,它将处理“给我一些文本”请求,生成一些文本(反汇编一些指令)和一些标签(用于着色、格式化等)并归还它们。

问题是我找不到任何关于如何以这种方式继承 GtkTextBuffer 以自己提供文本的信息。我已经尝试在我的子类中实现get_textandget_slice方法,但它们似乎永远不会被调用。似乎我唯一能做的就是使用标准的 GtkTextBuffer 和set_text方法,并尝试以某种方式跟踪光标位置和要显示的行数,但这似乎与 MVC 的工作方式完全相反。可能有数百万行,因此提前生成所有文本是不可行的。

我正在使用 Python 3.4 和 GTK3。

4

1 回答 1

0

Gtk.TextBuffer来自不是用 Python 编写的外部库。您遇到了这种情况的一个限制。对于大多数 Python 库,您可以根据需要对它们的类​​进行子类化或对其 API 进行猴子补丁。另一方面,GTK 的 C 代码不知道它是从 Python 中使用的,并且正如您所注意到的,它完全忽略了您的覆盖get_text()get_slice()方法。

GTK 的类还有一个限制,即您只能覆盖已声明为“虚拟”的方法。以下是如何将其转换为 Python:您可以在 Python GI 文档中查看虚拟方法列表(示例Gtk.TextBuffer)。这些方法都以do_并且不打算从您的程序中调用,只是被覆盖。Python GI 将使 GTK 代码知道这些覆盖,因此当您覆盖时,例如,do_insert_text()随后调用insert_text(),调用链将如下所示:

  • Pythoninsert_text()
    • Cgtk_text_buffer_insert_text()
      • C GtkTextBufferClass->insert_text()(内部虚方法)
        • Pythondo_insert_text()

不幸的是,正如您从我上面链接的文档中看到的那样,get_text()并且get_slice()不是虚拟的,因此您不能在子类中覆盖它们。

您可以通过将一个TextBuffer(包含全部反汇编指令)包装在另一个(包含摘录,实际上连接到文本视图)中来实现您的目标。您可以在第一个文本缓冲区中设置标记以显示摘录应该从哪里开始或结束,并连接信号,以便当第一个文本缓冲区中的文本更改或标记更改时,标记之间的文本将复制到第二个文本缓冲区。

于 2015-08-30T18:33:22.230 回答