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

使用qscintula和PyQt的自动完成建议中没有python关键字,python,pyqt,pyqt5,qscintilla,Python,Pyqt,Pyqt5,Qscintilla,我希望在使用PythonLexer设置api时,Python关键字的自动完成建议(即for、range、lambda),并希望使用标准库模块和函数(即sys、os.path)自动完成建议,但在下面的代码示例中,从,唯一发生的自动完成是添加到列表中的四个字符串 我是否做错了什么,如果是,如何让python关键字在自动完成中注册?(当然,我这里的主要问题) 如果这是预期的行为,那么lexer在autocomplete中扮演什么角色?在本例中,为什么lexer中的关键字没有被分配到autocomple

我希望在使用PythonLexer设置api时,Python关键字的自动完成建议(即
for、range、lambda
),并希望使用标准库模块和函数(即
sys、os.path
)自动完成建议,但在下面的代码示例中,从,唯一发生的自动完成是添加到列表中的四个字符串

我是否做错了什么,如果是,如何让python关键字在自动完成中注册?(当然,我这里的主要问题)

如果这是预期的行为,那么lexer在autocomplete中扮演什么角色?在本例中,为什么lexer中的关键字没有被分配到autocomplete列表中

最后,在autocomplete中是否可以有python标准库模块和子模块,这需要什么

“”“基本代码最初来自:http://kib2.free.fr/tutos/PyQt4/QScintilla2.html"""
导入系统
从PyQt5导入QtWidgets、Qsci
app=qtwidts.QApplication(sys.argv)
editor=Qsci.qscisintilla()
lexer=Qsci.qscilerpython()
编辑器.setLexer(lexer)
##设置自动完成
api=Qsci.QsciAPIs(lexer)
api.add(“aLongString”)
api.add(“aLongerString”)
api.添加(“adiffertstring”)
api.add(“sOmethingElse”)
api.prepare()
编辑器。设置自动完成阈值(1)
编辑器.setAutoCompletionSource(Qsci.qscisintilla.AcsAPIs)
编者:show()
editor.setText(打开(sys.argv[0]).read())
sys.exit(app.exec_())

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

感谢Ekhumaro引导我找到答案。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_())

谢谢你能解释一下lexer在自动完成中扮演的角色吗?另外,使用标准库中的函数实现标准库模块自动完成是否相对简单?我更新了答案,添加了知道库名称的功能,但它不是智能自动完成。如果我的答案有助于你,请不要忘记将其标记为正确。答案的方向是正确的,但有一些不希望的后果。例如,如果我将AUTComplement源代码设置为AcsAll,以便它包括文档单词和api,那么自动完成对于文档单词是有意义的。也就是说,当我键入
sys.
时,它会提示
sys.argv
sys.exit
bc它们在文档中。当我键入
range.r
时,它将建议
range.range
range.raise
,这显然没有意义。我不确定我要找的是一个有时会提示错误的自动完成。我的意思是,它不是一个智能的自动完成,你必须过滤提供QsciAPIs的数据。没有必要直接添加关键字。标准QSCINTILA安装提供了一些python api文件,可以在运行时加载。您还可以加载pyqt和QScintila本身的api文件。@ekhumoro在包中看到了这些api文件,但我不确定加载它们的函数调用是什么。你能提供一个例子吗?谢谢你的评论,我仔细查看了这里的课堂文档,找到了我想要的。见下面的答案。抱歉-我本来想添加一个答案,但你抢先回答了:)请注意,您可以从
api.installedAPI文件()
获取所有已安装api文件的列表。如果您想要python的语言关键字,您可以从
lexer.keywords(1).split()
.Hi@ekhumaro中分别添加它们。您能详细解释一下
api.load(…)
函数的实际功能吗?据我所知,它从给定的api文件中克隆关键字。
api.installedAPI文件()
是否只返回以前克隆过的文件名?我想将您的解释添加到我的网站@EKHUMO,如果您同意,我将在将您的解释添加到网站时适当参考您的StackOverflow帐户;-)@穆利埃。原始api文件安装在标准系统位置(通常在qt的共享数据目录中)。
api.load()
方法读取原始api文件,并将其存储在内部列表中。
api.prepare()
方法执行解析原始数据行并以可以有效访问的格式存储信息的实际工作。可以使用
api.savePrepared()
保存准备好的数据,并使用
api.loadPrepared()
重新加载。这些准备好的数据文件通常由应用程序按每个用户存储在配置目录中。@K.Mulier。谢谢你的提议,但我主要只是传递我在别处找到的信息。你正在做所有创建和维护网站的实际工作。如果您想在适当的时候给予表扬,请确保您在显著位置承认,因为他是QSCINTILA的作者,并且还提供PyQt绑定。您可能还应该提供指向的突出链接。