1

小さなアプリケーションにコード補完を追加したいと考えています。補完プロバイダーを作成し、ソースビューの補完オブジェクトに追加しましたが、残念ながら何かが機能していません: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()
4

1 に答える 1

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 などのすべてのインターフェイスのメソッドを実装する必要があります。GInterface プロパティをオーバーライドする方法が見つからなかったため、使用していない唯一のメソッドは do_get_priority です。

于 2015-03-16T16:45:46.173 に答える