【问题标题】:Using GtkTextView to display lots of generated text (custom GtkTextBuffer?)使用 GtkTextView 显示大量生成的文本(自定义 GtkTextBuffer?)
【发布时间】:2015-08-31 02:33:22
【问题描述】:

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

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

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

我正在使用 Python 3.4 和 GTK3。

【问题讨论】:

    标签: python model-view-controller gtk3 gtktextview


    【解决方案1】:

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

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

    • 蟒蛇insert_text()
      • Cgtk_text_buffer_insert_text()
        • CGtkTextBufferClass->insert_text()(内部虚方法)
          • 蟒蛇do_insert_text()

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 2018-08-26
      • 2015-10-05
      • 2015-09-19
      相关资源
      最近更新 更多