2016-12-16 4 views
0

Учитывая этот небольшой отрывок:питон выход каротаж на обоих GUI и консоли

import sys 
import os 
import logging 
from PyQt5 import QtGui, QtWidgets, QtCore 

log = logging.getLogger("Foo") 
logging.basicConfig(
    level=logging.INFO, format='%(levelname)s: %(filename)s - %(message)s') 
log.setLevel(logging.DEBUG) 


class ConsolePanelHandler(logging.Handler): 

    def __init__(self, parent): 
     logging.Handler.__init__(self) 
     self.parent = parent 

    def emit(self, record): 
     self.parent.write(self.format(record)) 


class Foo(QtWidgets.QWidget): 

    def __init__(self, parent=None): 
     QtWidgets.QWidget.__init__(self, parent) 

     self.textEdit = QtWidgets.QTextEdit(self) 
     self.textEdit.setLineWrapMode(QtWidgets.QTextEdit.NoWrap) 
     self.textEdit.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) 

     vbox = QtWidgets.QVBoxLayout() 
     self.setLayout(vbox) 
     vbox.addWidget(self.textEdit) 

    def write(self, s): 
     self.textEdit.setFontWeight(QtGui.QFont.Normal) 
     self.textEdit.append(s) 


if __name__ == "__main__": 
    app = QtWidgets.QApplication(sys.argv) 
    console_panel = Foo() 
    handler = ConsolePanelHandler(console_panel) 
    log.addHandler(handler) 

    log.info("Getting logger {0} - {1}".format(id(log), log.handlers)) 
    [log.debug("This is normal text " + str(i)) for i in range(5)] 
    console_panel.show() 

    sys.exit(app.exec_()) 

Вопросы:

  • Почему журнал пишущие как к консоли и графического интерфейса? Насколько я знаю log.handlers len должно быть только 1.
  • Как я могу написать только gui, подавляющее сообщения консоли?
  • Почему формат gui не тот, который указан basicConfig?

ответ

1

Ваша проблема вызвана вызовом basicConfig() во время импорта - в documented, это добавляет консоль регистратора в корневой регистратор, если он не имеет каких-либо обработчиков уже.

Вы должны удалить этот вызов и добавить строку в предложении if __name__ == '__main__':

handler.setFormatter(logging.Formatter('%(levelname)s: %(filename)s - %(message)s')) 

, а затем вы должны получить результат, который вы ожидаете.

Причина, по которой вы видели оба сообщения, заключается в том, что информация об информационных потоках между регистраторами и обработчиками описана в документации here.

+0

Один вопрос, хотя вы говорите: «Это добавляет консольный регистратор в корневой журнал, если он уже не имеет обработчиков» ... почему «log.handlers» не показывает мне консольный логгер после вызова ' basicConfig() '? – BPL

+0

@BPL 'log' не является корневым регистратором, а' log.handlers' правильно имеет один регистратор, который вы добавили. Вызов 'basicConfig()' добавляет обработчики в корневой журнал, которые также используются для вывода событий, зарегистрированных в журнал, в соответствии с ссылкой «поток информации» в моем ответе. –

+0

Есть ли способ получить экземпляр или id() этого корневого регистратора? Мне просто интересно узнать, где basicConfig() добавил обработчик. – BPL