使用QScintilla和PyQt的自动完成建议中没有python关键字

时间:2017-10-11 20:55:25

标签: python pyqt pyqt5 qscintilla

我期待Python关键字的自动完成建议(即for, range, lambda),并希望在使用QsciLexerPython词法分析器设置api时,使用标准库模块和函数(即sys, os.path等)获得自动完成建议,但在下面的代码示例中,从this website压缩和更新,发生的唯一自动完成是添加到列表中的四个字符串。

我做错了什么,如果是这样,我如何让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 个答案:

答案 0 :(得分:2)

感谢ekhumoro指导我的答案。 QsciAPIs类有一个加载方法,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_())

答案 1 :(得分:1)

qscintilla不知道python和库的关键字,QsciAPIs希望您提供信息,在下面的部分中我将展示一些返回关键字和标准库名称的函数。 qscintilla只会自动完成你提供的单词,如果你想要一个智能自动完成,我建议你做一个识别点或括号的逻辑,并过滤你提供给QsciAPIs的单词。

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_())