J'essaye de faire un simple texteditor avec la coloration syntaxique de base, l'achèvement de code et les fonctions cliquables & variables dans PyQt5. Mon meilleur espoir pour y parvenir est d'utiliser le port QScintilla
pour PyQt5.
J'ai trouvé l'exemple texteditor suivant QScintilla sur le site Web d'Eli Bendersky (http://eli.thegreenplace.net/2011/04/01/sample-using-qscintilla-with-pyqt, Victor S. l'a adapté à PyQt5). Je pense que cet exemple est un bon point de départ:Editeur de texte basé sur QScintilla dans PyQt5 avec des fonctions et des variables cliquables
#-------------------------------------------------------------------------
# qsci_simple_pythoneditor.pyw
#
# QScintilla sample with PyQt
#
# Eli Bendersky ([email protected])
# This code is in the public domain
#-------------------------------------------------------------------------
import sys
import sip
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.Qsci import QsciScintilla, QsciLexerPython
class SimplePythonEditor(QsciScintilla):
ARROW_MARKER_NUM = 8
def __init__(self, parent=None):
super(SimplePythonEditor, self).__init__(parent)
# Set the default font
font = QFont()
font.setFamily('Courier')
font.setFixedPitch(True)
font.setPointSize(10)
self.setFont(font)
self.setMarginsFont(font)
# Margin 0 is used for line numbers
fontmetrics = QFontMetrics(font)
self.setMarginsFont(font)
self.setMarginWidth(0, fontmetrics.width("00000") + 6)
self.setMarginLineNumbers(0, True)
self.setMarginsBackgroundColor(QColor("#cccccc"))
# Clickable margin 1 for showing markers
self.setMarginSensitivity(1, True)
# self.connect(self,
# SIGNAL('marginClicked(int, int, Qt::KeyboardModifiers)'),
# self.on_margin_clicked)
self.markerDefine(QsciScintilla.RightArrow,
self.ARROW_MARKER_NUM)
self.setMarkerBackgroundColor(QColor("#ee1111"),
self.ARROW_MARKER_NUM)
# Brace matching: enable for a brace immediately before or after
# the current position
#
self.setBraceMatching(QsciScintilla.SloppyBraceMatch)
# Current line visible with special background color
self.setCaretLineVisible(True)
self.setCaretLineBackgroundColor(QColor("#ffe4e4"))
# Set Python lexer
# Set style for Python comments (style number 1) to a fixed-width
# courier.
#
lexer = QsciLexerPython()
lexer.setDefaultFont(font)
self.setLexer(lexer)
text = bytearray(str.encode("Arial"))
# 32, "Courier New"
self.SendScintilla(QsciScintilla.SCI_STYLESETFONT, 1, text)
# Don't want to see the horizontal scrollbar at all
# Use raw message to Scintilla here (all messages are documented
# here: http://www.scintilla.org/ScintillaDoc.html)
self.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 0)
# not too small
self.setMinimumSize(600, 450)
def on_margin_clicked(self, nmargin, nline, modifiers):
# Toggle marker for the line the margin was clicked on
if self.markersAtLine(nline) != 0:
self.markerDelete(nline, self.ARROW_MARKER_NUM)
else:
self.markerAdd(nline, self.ARROW_MARKER_NUM)
if __name__ == "__main__":
app = QApplication(sys.argv)
editor = SimplePythonEditor()
editor.show()
editor.setText(open(sys.argv[0]).read())
app.exec_()
Il suffit de copier-coller ce code dans un fichier .py
vide, et l'exécuter. Vous devriez obtenir l'éditeur de texte simple suivant apparaît sur votre écran:
Remarquez comment parfait la coloration syntaxique est! QScintilla a certainement fait un peu d'analyse en arrière-plan pour y parvenir.
Est-il possible de faire fonctions cliquables & variables pour cette entrée de texte? Tout IDE qui se respecte l'a. Vous cliquez sur une fonction et l'IDE passe à la définition de la fonction. La même chose pour les variables. Je voudrais savoir:
- Est-ce que qscintilla soutien fonctions cliquables & les variables?
- Si ce n'est pas le cas, est-il possible d'importer un autre module python qui implémente cette fonctionnalité dans le logiciel de création de comptes QScintilla?
EDIT:
λuser noté ce qui suit:
noms de fonction cliquables exigent l'analyse complète avec une connaissance beaucoup plus approfondie d'un langage de programmation [..]
C'est bien au-delà la portée de Scintilla/QScintilla. Scintilla fournit un moyen de réagir lorsque la souris clique quelque part sur le texte, mais la logique de "où est la définition d'une fonction" n'est pas dans Scintilla et ne le sera probablement jamais.
Cependant, certains projets sont dédiés à cette tâche, comme ctags. Vous pouvez simplement écrire un wrapper autour de ce type d'outil.
je suppose que l'écriture comme emballage pour ctags est maintenant sur ma liste TODO. La toute première étape consiste à obtenir une réaction (signal Qt) lorsque l'utilisateur clique sur une fonction ou une variable. Et peut-être que la fonction/variable devrait devenir un peu bleutée lorsque vous passez la souris dessus, pour avertir l'utilisateur qu'il est cliquable. J'ai déjà essayé d'y parvenir, mais je suis retenu par la pénurie de documentation QScintilla.
Alors laissez-nous couperons la question: Comment faites-vous une fonction ou variable dans la cliquable texteditor qscintilla (avec cliquable défini comme 'quelque chose se passe')
EDIT:
Je viens de revenir à cette question maintenant - plusieurs mois plus tard. J'ai coopéré avec mon ami Matic Kukovec pour concevoir un site Web sur QScintilla. Il est un tutoriel débutant convivial sur la façon de l'utiliser:
J'espère que cette initiative comble le vide de la documentation manque.
Il y a deux questions distinctes ici. Le premier problème est de cliquer sur le texte et d'identifier le symbole à une position donnée. Ceci est pris en charge dans la mesure où toutes les fonctionnalités de bas niveau existent dans QScintilla/Scintilla pour que vous puissiez écrire l'implémentation vous-même. Le deuxième problème est de lier des symboles à des définitions, ce qui est une caractéristique normalement trouvée dans les IDE plutôt que "un simple éditeur de texte". Il n'y a pas de support direct pour cela, et même si vous utilisez quelque chose comme 'ctags', il va encore y avoir beaucoup de travail incorporant dans un éditeur de texte. – ekhumoro
Salut @ekhumoro, merci beaucoup pour votre aide. Je n'ai pas peur de beaucoup de travail, tant que je commence quelque part. Ce qui me retient en ce moment, c'est rendre les fonctions et les variables «cliquables» dans le sens où «quelque chose se passe». Une fois cela obtenu, je peux continuer à faire un wrapper pour 'ctags'. Avez-vous une idée sur la façon de faire cette première étape? La documentation QScintilla est très pauvre ... –
Je pense que vous devriez viser plus bas pour commencer. Configurez un [gestionnaire de menu contextuel personnalisé] (http://doc.qt.io/qt-5/qwidget.html#customContextMenuRequested), puis essayez quelque chose comme [wordAtPoint] (http://pyqt.sourceforge.net/ Docs/QScintilla2/classQsciScintilla.html # af6ff6d63f13aab28979985135203df70) pour obtenir le symbole au 'QPoint' donné. (PS: la façon de faire de la documentation est de lire d'abord les docs de Scintilla, puis de revenir aux docs de QScintilla pour voir quelles sont les API de haut niveau fournies. /SciTE.html) sont aussi parfois utiles). – ekhumoro