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?
risposta
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.
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)
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_()
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. –
utenti Bing dovrebbero andare [qui] (http://stackoverflow.com/questions/24469662/how-to-redirect-logger- output-in-pyqt-text-widget): P – Carel