2015-02-22 11 views
5

Attualmente sto lavorando su una GUI usando qt designer. Mi chiedo come dovrei andare a stampare stringhe sul gui che si comporta come una finestra di log. Sto usando pyqt5Il modo migliore per visualizzare i log in pyqt?

+0

utenti Bing dovrebbero andare [qui] (http://stackoverflow.com/questions/24469662/how-to-redirect-logger- output-in-pyqt-text-widget): P – Carel

risposta

1

Sembra che tu voglia utilizzare un widget QPlainTextEdit impostato in sola lettura.

Considerare di cambiare il colore di sfondo in grigio per dare all'utente un suggerimento che non è modificabile. Dipende anche da te se vuoi che sia scorrevole o che il testo sia selezionabile.

This answer può iniziare la sottoclasse di QPlainTextEdit per scorrere con l'output, salvare in un file, qualunque sia.

7

Se si utilizza il modulo Python logging per poter creare facilmente un gestore di registrazione personalizzato che trasmette i messaggi di registro a un'istanza QPlainTextEdit (come descritto da Christopher).

Per fare ciò, creare la sottoclasse logging.Handler. In questo __init__ creiamo il QPlainTextEdit che conterrà i registri. Il bit chiave qui è che l'handle riceverà i messaggi tramite la funzione emit(). Quindi sovraccarichiamo questa funzione e passiamo il testo del messaggio nello QPlainTextEdit.

import logging 

class QPlainTextEditLogger(logging.Handler): 
    def __init__(self, parent): 
     super(Logger, self).__init__() 

     self.widget = QPlainTextEdit(parent) 
     self.widget.setReadOnly(True) 

    def emit(self, record): 
     msg = self.format(record) 
     self.widget.textCursor().appendPlainText(msg) 

    def write(self, m): 
     pass 

Creare un oggetto da questa classe, passando il genitore per il QPlainTextEdit (ad esempio, la finestra principale, o un layout). È quindi possibile aggiungere questo gestore per il logger corrente.

# Set up logging to use your widget as a handler 
log_handler = QPlainTextEditLogger(<parent widget>) 
logging.getLogger().addHandler(log_handler) 
7

Ecco un esempio di lavoro completo basato su mfitzp's answer:

import sys 
from PyQt4 import QtCore, QtGui 
import logging 

# Uncomment below for terminal log messages 
# logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(name)s - %(levelname)s - %(message)s')  

class QPlainTextEditLogger(logging.Handler): 
    def __init__(self, parent): 
     super().__init__() 
     self.widget = QtGui.QPlainTextEdit(parent) 
     self.widget.setReadOnly(True)  

    def emit(self, record): 
     msg = self.format(record) 
     self.widget.appendPlainText(msg)  


class MyDialog(QtGui.QDialog, QPlainTextEditLogger): 
    def __init__(self, parent=None): 
     super().__init__(parent)  

     logTextBox = QPlainTextEditLogger(self) 
     # You can format what is printed to text box 
     logTextBox.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')) 
     logging.getLogger().addHandler(logTextBox) 
     # You can control the logging level 
     logging.getLogger().setLevel(logging.DEBUG) 

     self._button = QtGui.QPushButton(self) 
     self._button.setText('Test Me')  

     layout = QtGui.QVBoxLayout() 
     # Add the new logging box widget to the layout 
     layout.addWidget(logTextBox.widget) 
     layout.addWidget(self._button) 
     self.setLayout(layout)  

     # Connect signal to slot 
     self._button.clicked.connect(self.test)  

    def test(self): 
     logging.debug('damn, a bug') 
     logging.info('something to remember') 
     logging.warning('that\'s not right') 
     logging.error('foobar') 

if (__name__ == '__main__'): 
    app = None 
    if (not QtGui.QApplication.instance()): 
     app = QtGui.QApplication([]) 
    dlg = MyDialog() 
    dlg.show() 
    dlg.raise_() 
    if (app): 
     app.exec_() 
+0

Questa potrebbe essere una domanda stupida, ma quale è lo scopo di ereditare da 'QPlainTextEditLogger' in' MyDialog'? Sto cercando di convertire questo esempio in PyQt5, e non ho potuto farlo funzionare senza rimuovere quella seconda ereditarietà. Sembra funzionare senza di esso. –

Problemi correlati