Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Dernière révision Les deux révisions suivantes | ||
pyqt4_console_python [2013/01/28 06:18] tyrtamos |
pyqt4_console_python [2013/01/28 17:42] tyrtamos |
||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
[Python v2.7.3, PyQt4 v4.9.5, Qt4 v4.8.3] | [Python v2.7.3, PyQt4 v4.9.5, Qt4 v4.8.3] | ||
+ | |||
+ | [modification le 28/1/2013 16h] | ||
===== Objectif ===== | ===== Objectif ===== | ||
Ligne 35: | Ligne 37: | ||
L' | L' | ||
+ | |||
+ | Quelques modifications ont été faites depuis la toute 1ère publication (ce matin!). La plus importante est que l'on peut désormais fournir, dès le lancement, du code Python pour que l' | ||
+ | |||
+ | On peut ainsi: | ||
+ | |||
+ | * fournir une chaine de caractères: | ||
+ | |||
+ | * fournir une liste (ou un tuple) d' | ||
+ | |||
+ | Dans les 2 cas, les instructions seront exécutées comme si l' | ||
+ | |||
+ | si l' | ||
+ | |||
+ | Voir les exemples fournis à la fin du code ci-dessous. | ||
+ | |||
+ | Cette fonctionnalité va bien avec l' | ||
+ | |||
+ | Voilà ce que ça va donner: | ||
+ | |||
+ | {{: | ||
Voilà le code. | Voilà le code. | ||
Ligne 49: | Ligne 71: | ||
import code | import code | ||
import StringIO | import StringIO | ||
+ | from time import sleep | ||
from PyQt4 import QtCore, QtGui | from PyQt4 import QtCore, QtGui | ||
+ | |||
+ | ############################################################################# | ||
+ | # variables globales pour gérer les données communes avec le thread | ||
+ | |||
+ | mutexokwrite = QtCore.QMutex() | ||
+ | okwrite = False | ||
############################################################################# | ############################################################################# | ||
Ligne 112: | Ligne 141: | ||
def write(self, data): | def write(self, data): | ||
""" | """ | ||
+ | global okwrite, mutexokwrite # drapeau pour le shake-hand d' | ||
+ | | ||
# pour être sûr que data est en unicode | # pour être sûr que data est en unicode | ||
if not isinstance(data, | if not isinstance(data, | ||
Ligne 120: | Ligne 151: | ||
if data!=u"": | if data!=u"": | ||
# envoie la réponse sous forme de message (avec shake-hand) | # envoie la réponse sous forme de message (avec shake-hand) | ||
- | | + | |
+ | okwrite | ||
+ | mutexokwrite.unlock() | ||
self.emit(QtCore.SIGNAL(" | self.emit(QtCore.SIGNAL(" | ||
- | while not self.affichageok: | + | while not okwrite: |
pass | pass | ||
| | ||
# | # | ||
def textedispo(self, | def textedispo(self, | ||
- | """ | + | """ |
self.texte = texte | self.texte = texte | ||
| | ||
Ligne 133: | Ligne 166: | ||
def read(self, prompt): | def read(self, prompt): | ||
""" | """ | ||
+ | | ||
# envoi l' | # envoi l' | ||
self.write(prompt) | self.write(prompt) | ||
+ | |||
# retourne la chaine dès qu'il y en a une de saisie | # retourne la chaine dès qu'il y en a une de saisie | ||
while self.texte==None: | while self.texte==None: | ||
- | | + | |
texte = self.texte | texte = self.texte | ||
self.texte = None | self.texte = None | ||
Ligne 151: | Ligne 186: | ||
class Visu(QtGui.QTextEdit): | class Visu(QtGui.QTextEdit): | ||
| | ||
- | def __init__(self, | + | def __init__(self, |
+ | | ||
super(Visu, self).__init__(parent) | super(Visu, self).__init__(parent) | ||
self.setAcceptRichText(False) | self.setAcceptRichText(False) | ||
self.setLineWrapMode(QtGui.QTextEdit.NoWrap) | self.setLineWrapMode(QtGui.QTextEdit.NoWrap) | ||
- | | + | |
- | self.pos1 = self.textCursor().position() | + | # prépa du lancement du thread qui porte l' |
- | # lancement du thread qui porte l' | + | |
self.interpy = Interpy(self) | self.interpy = Interpy(self) | ||
- | self.interpy.start() | ||
- | # prépa pour recevoir du thread ' | ||
- | self.connect(self.interpy, | ||
# prépa pour recevoir de interpy un signal de fermeture de la fenêtre | # prépa pour recevoir de interpy un signal de fermeture de la fenêtre | ||
self.connect(self.interpy, | self.connect(self.interpy, | ||
+ | # prépa pour recevoir du thread ' | ||
+ | self.affichinit = False | ||
+ | self.connect(self.interpy, | ||
+ | # lancement du thread | ||
+ | self.interpy.start() | ||
+ | | ||
+ | # initialisation de la position du curseur dans le texte | ||
+ | self.pos1 = self.textCursor().position() | ||
+ | | ||
# initialisation de l' | # initialisation de l' | ||
self.historique = [] | self.historique = [] | ||
self.ih = 0 | self.ih = 0 | ||
- | # initialisation de l' | + | |
- | self.emit(QtCore.SIGNAL(" | + | |
- | self.emit(QtCore.SIGNAL(" | + | self.initpy = initpy |
+ | if isinstance(self.initpy, | ||
+ | | ||
+ | nfc = self.initpy | ||
+ | self.initpy = [] | ||
+ | if os.path.exists(nfc): | ||
+ | with open(nfc, ' | ||
+ | for ligne in f: | ||
+ | | ||
+ | |||
+ | else: | ||
+ | if not isinstance(self.initpy, (list, tuple)): | ||
+ | # mauvais type pour self.initpy: | ||
+ | self.initpy = [] | ||
+ | self.lginitpy = len(self.initpy) | ||
+ | self.nbinvites = -1 | ||
+ | | ||
+ | | ||
# | # | ||
def affiche(self, | def affiche(self, | ||
""" | """ | ||
+ | global okwrite, mutextokwrite # drapeau pour le shake-hand d' | ||
+ | | ||
# ajoute la chaine unicode à la fin du QTextEdit | # ajoute la chaine unicode à la fin du QTextEdit | ||
self.append(texte) | self.append(texte) | ||
Ligne 182: | Ligne 242: | ||
# met à jour la position du curseur dans le texte | # met à jour la position du curseur dans le texte | ||
self.pos1 = self.textCursor().position() | self.pos1 = self.textCursor().position() | ||
+ | | ||
# renvoie un accusé de réception de fin d' | # renvoie un accusé de réception de fin d' | ||
- | self.interpy.affichageok | + | |
- | + | okwrite = True | |
+ | mutexokwrite.unlock() | ||
+ | |||
+ | # envoie les lignes de code d' | ||
+ | if self.nbinvites< | ||
+ | if self.nbinvites> | ||
+ | self.emit(QtCore.SIGNAL(" | ||
+ | self.nbinvites += 1 | ||
# ======================================================================= | # ======================================================================= | ||
def keyPressEvent(self, | def keyPressEvent(self, | ||
Ligne 282: | Ligne 351: | ||
| | ||
# | # | ||
- | def __init__(self, | + | def __init__(self, initpy=[], parent=None): |
super(Consolepy, | super(Consolepy, | ||
| | ||
Ligne 292: | Ligne 361: | ||
# créer le QTextEdit personnalisé | # créer le QTextEdit personnalisé | ||
- | self.visu = Visu(self) | + | self.visu = Visu(self, initpy) |
| | ||
# Changer la police de caractères et sa taille | # Changer la police de caractères et sa taille | ||
Ligne 315: | Ligne 384: | ||
############################################################################# | ############################################################################# | ||
if __name__ == ' | if __name__ == ' | ||
+ | |||
app = QtGui.QApplication(sys.argv) | app = QtGui.QApplication(sys.argv) | ||
- | fen = Consolepy() | + | |
+ | # possibilité de donner comme argument une liste d' | ||
+ | initpy = [u"# -*- coding: utf-8 -*-", | ||
+ | u"from __future__ import division", | ||
+ | u"from math import *"] | ||
+ | # possibilité de donner comme argument un nom de fichier Python à exécuter | ||
+ | #initpy = " | ||
+ | # un argument d'un mauvais type ne sera pas considéré (ici un dictionnaire) | ||
+ | #initpy = {} | ||
+ | |||
+ | | ||
fen.show() | fen.show() | ||
sys.exit(app.exec_()) | sys.exit(app.exec_()) |