2017-10-11 80 views
2

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

我做错了什么,如果是这样,我怎么得到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

无需直接添加关键字。有标准qscintilla安装提供的python api文件,可以在运行时加载。您也可以加载pyqt和qscintilla本身的api文件。 – ekhumoro

+0

@ekhumoro查看软件包我看到这些API文件,但我不确定加载它们的函数调用是什么。你能提供一个例子吗? –

+0

感谢您的评论,我仔细查看了这里的课程文档,并找到了我正在寻找的内容。见下面的答案。 http://pyqt.sourceforge.net/Docs/QScintilla2/classQsciAPIs.html –

回答

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

请注意,您可以从'api.installedAPIFiles()'获得所有安装的api文件的列表。如果你想Python的语言关键字,你可以从'lexer.keywords(1).split()'单独添加它们。 – ekhumoro

+0

嗨@ekhumoro,你能给出更多关于'api.load(..)'函数实际上做什么的解释吗?据我所知,它克隆了给定api文件中的关键字。会'api。安装APIFiles()'只是返回以前被克隆过的文件名?我想将您的解释添加到我的网站https://qscintilla.com/autocompletion/ –

+0

@ekhumoro,如果您同意,我会在将您的解释添加到网站时适当参考您的StackOverflow帐户;-) –

1

qscintilla不知道蟒蛇的关键字,也没有图书馆,QsciAPIs希望,您提供的信息,在下面的部分,我展示一些函数返回的关键字和标准库的名称。 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_()) 
+0

谢谢。您能否解释词法分析器在自动填充中扮演的角色?另外,使用标准库中的函数实现标准库模块自动完成相对简单吗? –

+0

我已经更新了我的答案,我添加了知道库的名称的功能,但它不是智能的自动完成功能。如果我的回答有帮助,请不要忘记标记为正确。 – eyllanesc

+0

答案是朝着正确的方向发展,但有一些不利的后果。例如,如果我将自动完成源设置为AcsAll,以便它包含文档单词以及api,则自动完成对文档单词有意义。也就是说,当我键入'sys.'时,它建议'sys.argv'和'sys.exit' bc它们在文档中。当我输入'range.r'时,它会显示'range.range'和'range.raise',这显然没有任何意义。我不确定有时会提示错误事物的自动完成是我正在寻找的。 –

相关问题