2017-10-11 78 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',這顯然沒有任何意義。我不確定有時會提示錯誤事物的自動完成是我正在尋找的。 –

相關問題