Нет ключевых слов python в предложениях автозаполнения с использованием QScintilla и PyQt

Я ожидал предложения автозаполнения ключевых слов Python (т.е. for, range, lambda) и надеется на автозаполнение предложений со стандартными библиотечными модулями и функциями (т.е. sys, os.pathи т. д.) при настройке API с помощью лексера QsciLexerPython, но в приведенном ниже примере кода, сжатом и обновленном с этого веб-сайта, единственное автоматическое завершение, которое происходит, - это четыре строки, добавленные в список.

Я делаю что-то не так, и если да, то как мне получить ключевые слова Python для регистрации в автозаполнении? (Мой главный вопрос здесь конечно)

Если, скорее, это ожидаемое поведение, какую роль играет лексер в автозаполнении и почему ключевые слова из лексера не назначаются в списки автозаполнения в этом примере?

Наконец, возможно ли иметь в автозаполнении модули стандартной библиотеки Python и субмодули, и что для этого требуется?

"""Base code originally from: http://kib2.free.fr/tutos/PyQt4/QScintilla2.html"""

import sys
from PyQt5 import QtWidgets, Qsci

app = QtWidgets.QApplication(sys.argv)
editor = Qsci.QsciScintilla()
lexer = Qsci.QsciLexerPython()
editor.setLexer(lexer)

## setup autocompletion
api = Qsci.QsciAPIs(lexer)
api.add("aLongString")
api.add("aLongerString")
api.add("aDifferentString")
api.add("sOmethingElse")
api.prepare()
editor.setAutoCompletionThreshold(1)
editor.setAutoCompletionSource(Qsci.QsciScintilla.AcsAPIs)

editor.show()
editor.setText(open(sys.argv[0]).read())
sys.exit(app.exec_())

2 ответа

Решение

Спасибо Эхуморо за руководство к ответу. Класс QsciAPIs имеет метод load, а PyQt поставляется с набором файлов API. Ниже приведен код, который выполняет правильное автозаполнение так, как я искал:

"""Base code originally from: http://kib2.free.fr/tutos/PyQt4/QScintilla2.html"""

import sys
import os
import PyQt5
from PyQt5 import QtWidgets, Qsci

app = QtWidgets.QApplication(sys.argv)
editor = Qsci.QsciScintilla()
lexer = Qsci.QsciLexerPython(editor)
editor.setLexer(lexer)

## setup autocompletion
api = Qsci.QsciAPIs(lexer)

# import the desired api file
pyqt_path = os.path.dirname(PyQt5.__file__)
api.load(os.path.join(pyqt_path, "Qt/qsci/api/python/Python-3.6.api"))

api.prepare()
editor.setAutoCompletionThreshold(1)
editor.setAutoCompletionSource(Qsci.QsciScintilla.AcsAll)

editor.show()
editor.setText(open(sys.argv[0]).read())
sys.exit(app.exec_())

qscintilla не знает ни ключевых слов python, ни библиотек, QsciAPI надеется, что вы предоставите информацию, в следующей части я покажу некоторые функции, которые возвращают ключевые слова и имя стандартных библиотек. qscintilla выполнит автозаполнение только теми словами, которые вы предоставляете. Если вы хотите интеллектуальное автозаполнение, я рекомендую вам сделать логику, которая распознает точки или скобки и отфильтрует слова, которые вы предоставляете для QsciAPI.

import sys
from PyQt5 import QtWidgets, Qsci
import keyword
import pkgutil

app = QtWidgets.QApplication(sys.argv)
editor = Qsci.QsciScintilla()
lexer = Qsci.QsciLexerPython()
editor.setLexer(lexer)

## setup autocompletion
api = Qsci.QsciAPIs(lexer)

for key in keyword.kwlist + dir(__builtins__):
    api.add(key)

for importer, name, ispkg in pkgutil.iter_modules():
    api.add(name)

api.prepare()

editor.setAutoCompletionThreshold(1)
editor.setAutoCompletionSource(Qsci.QsciScintilla.AcsAPIs)

editor.show()
editor.setText(open(sys.argv[0]).read())
sys.exit(app.exec_())
Другие вопросы по тегам