2017-10-11 29 views
2

파이썬 키워드에 대한 자동 제안 제안 (예 : for, range, lambda)과 함께 표준 라이브러리 모듈 및 함수 (예 : sys, os.path 등)에 대한 자동 완성 제안을 기대했습니다. QsciLexerPython 렉서이지만, 아래의 코드 예제에서는 this website에서 압축되고 업데이트되며, 자동 완료는 목록에 추가 된 네 개의 문자열입니다.QScintilla 및 PyQt를 사용하여 자동 완성 제안에 파이썬 키워드가 없음

내가 잘못하고 있는데, 그렇다면 어떻게 파이썬 키워드를 자동 완성에 등록 할 수 있습니까? (당연히 여기에서 내 주요 질문입니다)

오히려 이것이 예상되는 동작이라면, 렉서가 자동 완성에서 어떤 역할을합니까? 그리고이 예제에서 렉서의 키워드가 자동 완성 목록에 지정되지 않은 이유는 무엇입니까?

마지막으로 파이썬 표준 라이브러리 모듈과 하위 모듈을 자동 완성에 포함 할 수 있습니까? 그게 필요한 것은 무엇입니까?

"""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

답장을 보내 주신 에쿠 모로에게 감사드립니다. 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_()) 
+2

'api.installedAPIFiles()'에서 설치된 모든 api 파일의 목록을 얻을 수 있습니다. 파이썬에 대한 언어 키워드를 원한다면,'lexer.keywords (1) .split()'에서 키워드를 개별적으로 추가 할 수 있습니다. – ekhumoro

+0

안녕하세요 @ echumoro, 당신은'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

thanks. 렉서가 자동 완성에서 어떤 역할을하는지 설명해 주시겠습니까? 또한 표준 라이브러리의 함수를 사용하여 표준 라이브러리 모듈 자동 완성을 구현하는 것이 비교적 간단합니까? –

+0

답을 업데이트했습니다. 라이브러리의 이름을 알 수있는 기능이 추가되었지만 스마트 자동 완성이 아닙니다. 내 대답이 올바른 것으로 표시하는 것을 잊지 마시기 바랍니다. – eyllanesc

+0

답변은 올바른 방향이지만 바람직하지 않은 결과가 있습니다. 예를 들어 Autippletion 소스를 AcsAll로 설정하여 API뿐만 아니라 문서 단어도 포함하도록하면 자동 완성이 문서 단어에 적합합니다. 즉,'sys '라고 입력하면 문서에있는'sys.argv'와'sys.exit'를 표시합니다. 'range.r'을 타이핑하면 분명히 의미가없는'range.range'와'range.raise'를 제안 할 것입니다. 가끔 잘못된 정보를 제안하는 자동 완성 기능이 내가 원하는 정보인지 확신 할 수 없습니다. –