Partage
  • Partager sur Facebook
  • Partager sur Twitter

Insérer un log avec pyqt4

27 octobre 2011 à 22:34:27

Bonjour,
j'aimerais dans mon programme graphique avec pyqt4 insérer un log (dynamique, pas juste le contenu d'un fichier), c'est à dire avoir une zone de texte ou les resultats d'un programme serait affichee, un peu comme tail -f mais en graphique, je sais qu'on peut le faire avec un QtextEdit ( je l'ai lu quelque part ) mais je n'ai aucune idée de comment procéder pour y arriver.

Merci d'avance :)
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
28 octobre 2011 à 12:34:31

Met un début de code (fonctionnel), on complétera par la suite.

En même temps des exemples de code avec QTextEdit ça ne manque pas sur le web.

  • Partager sur Facebook
  • Partager sur Twitter
28 octobre 2011 à 15:00:28

Alors mon début de code n'est pas bien défini pour le moment car je ne peux pas tester mon appli dans son ensemble, je m'explique :

pour lancer le start.py qui démarre la gui j'ai besoin de privilège root or, on ne peut lancer pyqt4 en root ( faudra que je trouve une solution, car kdesu ne marche pas, je crois qu'il exite pyroot mais je ne sais pas comment ça marche ).

Sur Developpez.com on m'a dit qu'il suffisait de faire cela pour créer un log, et ca m'a l'air plutot pas mal :
# Ton editeur
        self.editor = QtGui.QPlainTextEdit(MainWindow)
        self.editor.setReadOnly(True)
 
    def _print(self, s):
        line = QtCore.QString.fromUtf8(s)  # si necessaire
        self.editor.appendPlainText(line)
        self.editor.ensureCursorVisible()

En gros ça fait comme un print mais dans le log. Il faut que je teste pour savoir si ça marche mais comme je l'ai dis plus haut je sèche avec ce problèmes de root ( si je lance start.py comme user root, j'obtiens cannot open display 0)

EDIT :
Sinon je ne sais pas si j'ai le droit de montrer mon code etant donné qu'il pourrait être utilisé illégalement par des personnes mal intentionnées ( à la base c'est une appli de pentest ).
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
28 octobre 2011 à 15:45:29

Oui en gros c'est ce que je t'aurais proposé,mais avec QTextEdit

il fonctionne un peu de la même façon, il t'a rajouté une ou deux options, c'est pas plus mal.

Il faudrait aussi savoir sous quelle forme tu récupères les données de l'autre programme.

Car dans le cas du code ci-dessus, on écrit une seule ligne (sûrement besoin d'une boucle for pour toutes les lignes)

Tu veux t'introduire dans un système linux?
  • Partager sur Facebook
  • Partager sur Twitter
28 octobre 2011 à 16:34:06

Alors en fait j'ai modifie son code : j'ai pris juste un qtextedit car je n'ai pas besoin des options de QPlainTextEdit

Je recupere les donnees depuis un fichier de log et je procede comme ça ( dans une fonction qui se lance avec un bouton):

log = open("/var/log/program/log.log", 'r')

while(1):
	# Look every 2 second for a new log 
	os.system("sleep 2")
	print_program_log(log.readline(),"log_log")

Voilà le code de la methode qui est appelé :
def print_program_log(self,s,log_name):

		if(log_name == "crack_wep_log"):

			self.ui.crack_wep_log.append(s)

			self.ui.textEdit.ensureCursorVisible()

		elif(log_name == "crack_wpa_log"):

			self.ui.crack_wpa_log.append(s)

			self.ui.textEdit.ensureCursorVisible()

		elif(log_name == "log_log"):

			self.ui.log_log.append(s)

			self.ui.log_log.ensureCursorVisible()

A chaque fois ( toutes les 2 secondes ) j'affiche le contenu de log.readline() dans le QTextEdit ( c'est pas super mais bon ), si tu sais comment transmettre en "temps reel" comme un tail -f je suis preneur car une ligne toute les deux secondes c'est pas super et c'est décalé avec ce qu'il se passe ( je rajouterais aussi une instruction break genre si la dernière ligne est egal a "FIN" ou "EOF" il s'arrete mais là je ne l'ai pas encore mise ).

EDIT : j'ai un doute ! Ma solution plus haut n'est peut-etre pas valide car ça suppose que le fichier soit ouvert à la fois en ecriture et en lecture donc ça ne fonctionne pas :(, je ne vois toujours pas comment mettre la sortie d'un programme dans ce QTextEdit ( à moins de tout coder "en dur" sans modularite dans les fonctions de la classe pyqt4 mais alors ça devient illisible et on perd le cote objet ).
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
28 octobre 2011 à 16:57:02

Citation

A chaque fois ( toutes les 2 secondes ) j'affiche le contenu de log.readline() dans le QTextEdit ( c'est pas super mais bon ), si tu sais comment transmettre en "temps reel" comme un tail -f je suis preneur car une ligne toute les deux secondes c'est pas super et c'est décalé avec ce qu'il se passe ( je rajouterais aussi une instruction break genre si la dernière ligne est egal a "FIN" ou "EOF" il s'arrete mais là je ne l'ai pas encore mise ).



Oui, google + doc = réponse

  • Partager sur Facebook
  • Partager sur Twitter
28 octobre 2011 à 16:59:53

Damned ! Merci de m'avoir trouver ça c'est exactement ce que je cherchais :) !

Si ça interesse voilà un code operationnel :
import time
import sys
 
def tail_f(file):
  interval = 1.0
 
  while True:
    where = file.tell()
    line = file.readline()
    if not line:
      time.sleep(interval)
      file.seek(where)
    else:
      yield line
 
 
for line in tail_f(open(sys.argv[1])):
  print line


http://www.linux-support.com/cms/en/co [...] ail-in-python
  • Partager sur Facebook
  • Partager sur Twitter