2017-10-11 3 views
2

Je m'attendais à des suggestions de saisie semi-automatique des mots-clés Python (ie for, range, lambda) et espérant des suggestions de saisie semi-automatique avec les modules et fonctions standard de la bibliothèque (ie sys, os.path, etc.) lors de la configuration d'une API QsciLexerPython lexer, mais dans l'exemple de code ci-dessous, compressé et mis à jour à partir de this website, le seul achèvement automatique qui se produit sont les quatre chaînes ajoutées à la liste. Est-ce que je fais quelque chose de mal, et si oui, comment puis-je obtenir des mots-clés python à enregistrer dans la saisie semi-automatique? (Ma question principale ici bien sûr)pas de mots-clés python dans les suggestions de saisie semi-automatique avec QScintilla et PyQt

Si c'est plutôt le comportement attendu, quel rôle joue le lexer dans la saisie semi-automatique et pourquoi les mots-clés du lexer ne sont-ils pas assignés aux listes de saisie semi-automatique dans cet exemple? Enfin, est-il possible d'avoir des modules de bibliothèque standard python et des sous-modules dans la saisie semi-automatique, et qu'est-ce que cela nécessite?

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

Il n'est pas nécessaire d'ajouter les mots-clés directement. Il existe des fichiers api python fournis par l'installation standard de qscintilla qui peuvent être chargés au moment de l'exécution. Vous pouvez également charger des fichiers api pour pyqt et pour qscintilla lui-même. – ekhumoro

+0

@ekhumoro En regardant dans le paquet, je vois ces fichiers api, mais je ne suis pas certain de l'appel de la fonction pour les charger. Pourriez-vous fournir un exemple? –

+0

Merci pour le commentaire, je suis allé regarder de plus près la documentation de la classe ici et j'ai trouvé ce que je cherchais. Voir la réponse ci-dessous. http://pyqt.sourceforge.net/Docs/QScintilla2/classQsciAPIs.html –

Répondre

2

Merci à ekhumoro pour me guider à la réponse. La classe QsciAPIs a une méthode de chargement, et PyQt est livré avec un ensemble de fichiers api. Ci-dessous est le code qui fait l'autocomplétion correcte de la manière que je cherchais:

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

Notez que vous pouvez obtenir une liste de tous les fichiers api installés à partir de 'api.installedAPIFiles()'. Si vous voulez les mots-clés de langage pour python, vous pouvez les ajouter individuellement à partir de 'lexer.keywords (1) .split()'. – ekhumoro

+0

Salut @ekhumoro, pourriez-vous donner plus d'explications sur ce que fait réellement la fonction 'api.load (..)'? D'après ce que je comprends, il clone les mots-clés du fichier api donné. Va 'api.installedAPIFiles() 'retourne juste les noms de fichiers qui ont été clonés auparavant? Je voudrais ajouter vos explications à mon site Web https://qscintilla.com/autocompletion/ –

+0

@ekhumoro, si vous êtes d'accord, je ferai référence à votre compte StackOverflow lors de l'ajout de vos explications sur le site ;-) –

1

qscintilla ne connaît pas les mots-clés de python, ni des bibliothèques, QsciAPIs espère que vous fournir des informations, dans la partie suivante, je montre quelques fonctions qui renvoient les mots-clés et le nom des bibliothèques standard. qscintilla ne remplira automatiquement que les mots que vous fournissez, si vous voulez une saisie semi-automatique intelligente, je vous recommande de faire une logique qui reconnaît les points ou les parenthèses et filtre les mots que vous fournissez aux 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

merci. Pourriez-vous expliquer le rôle joué par le lexer dans la saisie semi-automatique? En outre, est-il relativement simple d'implémenter la saisie semi-automatique du module de bibliothèque standard avec des fonctions de la bibliothèque standard? –

+0

J'ai mis à jour ma réponse, j'ai ajouté la fonctionnalité de connaître les noms des bibliothèques, mais ce n'est pas une auto-complétion intelligente. S'il vous plaît, si ma réponse vous aide à ne pas oublier de le marquer comme correct. – eyllanesc

+0

la réponse est dans la bonne direction, mais a des conséquences indésirables. Par exemple, si je définis la source d'exécution automatique sur AcsAll afin qu'elle comprenne des mots de document ainsi que l'API, l'auto-complétion prend tout son sens pour les mots de document. À savoir, quand je tape 'sys.' il suggère' sys.argv' et 'sys.exit' bc ils sont dans le document. Quand je tape 'range.r', il va suggérer' range.range' et 'range.raise' qui n'ont évidemment aucun sens. Je ne suis pas sûr qu'une autocomplete qui suggère parfois de mauvaises choses est ce que je cherche. –