2015-02-22 5 views
5

मैं वर्तमान में क्यूटी डिजाइनर का उपयोग कर एक गुई पर काम कर रहा हूं। मैं सोच रहा हूं कि मुझे गुई पर स्ट्रिंग्स प्रिंटिंग के बारे में कैसे जाना चाहिए जो लॉग विंडो की तरह काम करता है। मैं pyqt5pyqt में लॉग प्रदर्शित करने का सबसे अच्छा तरीका?

+0

बिंग उन [यहां] जाना चाहिए (http://stackoverflow.com/questions/24469662/how-to-redirect-logger- आउटपुट-इन-पीईटीटी-टेक्स्ट-विजेट): पी – Carel

उत्तर

1

का उपयोग कर रहा हूं जैसे लगता है कि आप QPlainTextEdit विजेट केवल पढ़ने के लिए सेट करना चाहते हैं।

उपयोगकर्ता को यह संकेत देने के लिए भूरे रंग के पृष्ठभूमि रंग को बदलने पर विचार करें कि यह संपादन योग्य नहीं है। यदि आप स्क्रॉल करने योग्य या पाठ चुनने योग्य होना चाहते हैं तो यह आपके ऊपर भी है।

This answer आउटपुट के साथ स्क्रॉल करने के लिए QPlainTextEdit को उपclassing शुरू कर सकते हैं, फ़ाइल में सहेज सकते हैं, जो भी हो।

7

आप आसानी से एक कस्टम प्रवेश हैंडलर कि (के रूप में क्रिस्टोफर द्वारा वर्णित) एक QPlainTextEdit उदाहरण के लिए के माध्यम से लॉग संदेशों गुजरता बना सकते हैं करने के लिए अजगर logging मॉड्यूल उपयोग कर रहे हैं।

ऐसा करने के लिए आप पहले logging.Handler उपclass। इस __init__ में हम QPlainTextEdit बनाते हैं जिसमें लॉग होंगे। यहां महत्वपूर्ण बात यह है कि हैंडल emit() फ़ंक्शन के माध्यम से संदेश प्राप्त करेगा। इसलिए हम इस फ़ंक्शन को अधिभारित करते हैं और संदेश टेक्स्ट को 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 

इस वर्ग से एक वस्तु बनाने के लिए, यह QPlainTextEdit (जैसे मुख्य विंडो, या एक लेआउट) के लिए माता-पिता गुजर। फिर आप वर्तमान हैंगर के लिए इस हैंडलर को जोड़ सकते हैं।

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

यहां एक संपूर्ण काम कर उदाहरण 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

यह एक बेवकूफ सवाल हो सकता है, लेकिन 'MyDialog' में' QPlainTextEditLogger' से विरासत का उद्देश्य क्या है? मैं इस उदाहरण को PyQt5 में बदलने की कोशिश कर रहा हूं, और इसे दूसरी विरासत को हटाए बिना काम करने के लिए नहीं मिल सका। ऐसा लगता है कि इसके बिना ठीक काम करता है। –

संबंधित मुद्दे