【问题标题】:How to implement gtksourceview2.CompletionProvider?如何实现 gtksourceview2.CompletionProvider?
【发布时间】:2014-10-18 17:39:16
【问题描述】:

我想为我的小应用程序添加代码完成功能。我创建了我的完成提供程序,将其添加到我的源视图中的完成对象,但不幸的是有些东西不起作用:P 当我运行我的测试应用程序(如下所列)时,我收到错误:

app = Application()
File "./test.py", line 37, in __init__
self.__completion_window.show()
TypeError: providers must be a list

为什么会发生这种情况,我该如何解决?

这是产生此错误的示例应用程序:

#!/usr/bin/env python

import keyword
import gtk
import gobject
import gtksourceview2


class MyCompletionProvider(gobject.GObject, gtksourceview2.CompletionProvider):

    def __init__(self):
        gobject.GObject.__init__(self)

    def do_get_name(self):
        return 'PythonKeywords'

    def do_get_activation(self):
        return gtksourceview2.COMPLETION_ACTIVATION_USER_REQUESTED

    def do_match(self, context):
        return True

    def do_get_start_iter(self, context):
        return context.get_iter()

    def do_activate_proposal(self, proposal, iter):
        return True

    def do_populate(self, context):
        self.completions = []
        for compl in keyword.kwlist:
            self.completions.append(
                gtksourceview2.CompletionItem(
                    compl.name, compl.complete, info=compl.type))
        context.add_proposals(self, self.completions, True)


gobject.type_register(MyCompletionProvider)


class Application(gtk.Window):

    def __init__(self):
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
        self.connect('destroy', lambda e: gtk.main_quit())
        self.set_size_request(640, 480)
        self.__buffer = gtksourceview2.Buffer()
        self.__buffer.set_text('a' * 20)
        self.__editor = gtksourceview2.View(self.__buffer)
        self.__completion_window = self.__editor.get_completion()
        self.__completion_window.add_provider(MyCompletionProvider())
        self.add(self.__editor)
        self.show_all()
        self.__completion_window.show()

app = Application()
gtk.main()

【问题讨论】:

    标签: python gtk gtksourceview


    【解决方案1】:

    您必须使用上下文的 add_proposal 方法提供 CompletionItem 实例的列表

    def do_populate(self, context):
        ...
        self.completions = []
        for compl in script.completions():
            self.completions.append(sview.CompletionItem(compl.name, compl.complete, info=compl.type))
        context.add_proposals(self, self.completions, True)
    

    还有更多,你必须实现所有接口的方法,比如 do_match、do_get_start_iter 等 我唯一没有使用的是 do_get_priority,因为没有找到覆盖 GInterface 属性的方法。

    【讨论】:

    • 嗨,很高兴看到有人挖出了我的问题 :) 我已将您的想法纳入我的代码,但不幸的是错误没有改变。我用更新的示例应用程序编辑了我的帖子,如果你有时间和想法,我很乐意测试它们:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2014-09-06
    • 2013-12-16
    相关资源
    最近更新 更多