Source code for QWLogger

#------------------------------
# Description:
#------------------------------

"""QWLogger - GUI for Logger

This software was developed for the SIT project.
If you use all or part of it, please give an appropriate acknowledgment.

@version $Id: QWLogger.py 13157 2017-02-18 00:05:34Z dubrovin@SLAC.STANFORD.EDU $

@author Mikhail S. Dubrovin
"""
#------------------------------

import os
from PyQt4 import QtGui, QtCore
from graphqt.Styles import style

#------------------------------

[docs]class QWLogger(QtGui.QWidget) : """GUI for Logger""" _name = 'QWLogger' def __init__(self, log, cp, show_buttons=True) : QtGui.QWidget.__init__(self, parent=None) self.cp = cp self.log = log self.show_buttons = show_buttons self.box_txt = QtGui.QTextEdit() #self.tit_title = QtGui.QLabel('Logger') self.tit_status = QtGui.QLabel('Status:') self.tit_level = QtGui.QLabel('Verbosity level:') self.but_close = QtGui.QPushButton('&Close') self.but_save = QtGui.QPushButton('&Save log-file') self.list_of_levels = self.log.getListOfLevels() self.box_level = QtGui.QComboBox(self) self.box_level.addItems(self.list_of_levels) self.box_level.setCurrentIndex(self.list_of_levels.index(self.cp.log_level.value())) self.hboxM = QtGui.QHBoxLayout() self.hboxM.addWidget(self.box_txt) self.hboxB = QtGui.QHBoxLayout() self.hboxB.addWidget(self.tit_status) self.hboxB.addStretch(4) self.hboxB.addWidget(self.tit_level) self.hboxB.addWidget(self.box_level) self.hboxB.addStretch(1) self.hboxB.addWidget(self.but_save) self.hboxB.addWidget(self.but_close) self.vbox = QtGui.QVBoxLayout() #self.vbox.addWidget(self.tit_title) self.vbox.addLayout(self.hboxM) self.vbox.addLayout(self.hboxB) self.setLayout(self.vbox) if self.show_buttons : self.connect(self.but_close, QtCore.SIGNAL('clicked()'), self.onClose) self.connect(self.but_save, QtCore.SIGNAL('clicked()'), self.onSave) self.connect(self.box_level, QtCore.SIGNAL('currentIndexChanged(int)'), self.onBox) self.startGUILog() self.set_tool_tips() self.set_style() self.cp.qwlogger = self def set_tool_tips(self): #self .setToolTip('This GUI is for browsing log messages') self.box_txt .setToolTip('Window for log messages') self.but_close .setToolTip('Close this window') self.but_save .setToolTip('Save current content of the GUI Logger\nin work directory file: '+os.path.basename(self.fname_log)) self.tit_status .setToolTip('The file name, where this log \nwill be saved at the end of session') self.box_level .setToolTip('Click on this button and \nselect the level of messages \nwhich will be displayed') def set_style(self): self.setGeometry(200, 400, 500, 300) self. setStyleSheet(style.styleBkgd) #self.tit_title.setStyleSheet(style.styleTitleBold) self.tit_status.setStyleSheet(style.styleTitle) self.tit_level .setStyleSheet(style.styleTitle) self.but_close .setStyleSheet(style.styleButton) self.but_save .setStyleSheet(style.styleButton) self.box_level .setStyleSheet(style.styleButton) self.box_txt .setReadOnly(True) self.box_txt .setStyleSheet(style.styleWhiteFixed) #self.box_txt .ensureCursorVisible() #self.tit_title.setAlignment(QtCore.Qt.AlignCenter) #self.titTitle.setBold() self.tit_status.setVisible(self.show_buttons) self.tit_level .setVisible(self.show_buttons) self.box_level .setVisible(self.show_buttons) self.but_save .setVisible(self.show_buttons) self.but_close .setVisible(self.show_buttons) if not self.show_buttons : self.setContentsMargins(QtCore.QMargins(-9,-9,-9,-9)) self.setMinimumHeight(50) self.setMinimumSize(300,50) #self.setBaseSize(500,200) #def setParent(self,parent) : # self.parent = parent #def resizeEvent(self, e): #self.log.debug('resizeEvent', self._name) #pass #def moveEvent(self, e): #self.log.debug('moveEvent', self._name) #self.cp.posGUIMain = (self.pos().x(),self.pos().y()) #pass def closeEvent(self, e): self.log.debug('closeEvent', self._name) #self.log.info('%s.closeEvent' % self._name) #self.saveLogTotalInFile() # It will be saved at closing of GUIMain QtGui.QWidget.closeEvent(self, e) def onClose(self): self.log.debug('onClose', self._name) self.close() def onSave(self): self.log.debug('onSave:', self._name) self.saveLogInFile() def onBox(self): level_selected = self.box_level.currentText() self.cp.log_level.setValue( level_selected ) self.log.info('onBox - selected ' + self.tit_level.text() + ' ' + self.cp.log_level.value(), self._name) self.log.setLevel(self.cp.log_level.value()) self.box_txt.setText(self.log.getLogContent()) def saveLogInFile(self): self.log.info('saveLogInFile ' + self.fname_log, self._name) path = str(QtGui.QFileDialog.getSaveFileName(self, caption = 'Select the file to save log', directory = self.fname_log, filter = '*.txt' )) if path == '' : self.log.debug('Saving is cancelled.', self._name) return self.log.info('Output file: ' + path, self._name) self.log.saveLogInFile(path) self.fname_log = path self.cp.log_file.setValue(path) def saveLogTotalInFile(self): self.log.info('saveLogTotalInFile' + self.fname_log_total, self._name) self.log.saveLogTotalInFile(self.fname_log_total)
[docs] def getConfirmation(self): """Pop-up box for confirmation""" msg = QtGui.QMessageBox(self, windowTitle='Confirm closing!', text='You are about to close GUI Logger...\nIf the log-file is not saved it will be lost.', standardButtons=QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard | QtGui.QMessageBox.Cancel) msg.setDefaultButton(msg.Save) clicked = msg.exec_() if clicked == QtGui.QMessageBox.Save : self.log.info('Saving is requested', self._name) elif clicked == QtGui.QMessageBox.Discard : self.log.info('Discard is requested', self._name) else : self.log.info('Cancel is requested', self._name) return clicked
def onShow(self): self.log.info('onShow - is not implemented yet...', self._name) def startGUILog(self) : self.fname_log = self.cp.log_file.value() #self.fname_log_total = self.cp.log_file_total.value() self.setStatus(0, 'Log-file: ' + os.path.basename(self.fname_log)) self.log.setLevel(self.cp.log_level.value()) self.box_txt.setText(self.log.getLogContent()) self.log.setGUILogger(self) self.log.debug('QWLogger is open', self._name) self.box_txt.moveCursor(QtGui.QTextCursor.End) def appendGUILog(self, msg='...'): self.box_txt.append(msg) self.scrollDown() def scrollDown(self): #print 'scrollDown' #scrol_bar_v = self.box_txt.verticalScrollBar() # QScrollBar #scrol_bar_v.setValue(scrol_bar_v.maximum()) self.box_txt.moveCursor(QtGui.QTextCursor.End) self.box_txt.repaint() #self.raise_() #self.box_txt.update() def setStatus(self, status_index=0, msg=''): list_of_states = ['Good','Warning','Alarm'] if status_index == 0 : self.tit_status.setStyleSheet(style.styleStatusGood) if status_index == 1 : self.tit_status.setStyleSheet(style.styleStatusWarning) if status_index == 2 : self.tit_status.setStyleSheet(style.styleStatusAlarm) #self.tit_status.setText('Status: ' + list_of_states[status_index] + msg) self.tit_status.setText(msg)
#------------------------------ if __name__ == "__main__" : import sys from graphqt.IVConfigParameters import cp from graphqt.Logger import log app = QtGui.QApplication(sys.argv) w = QWLogger(log, cp) w.setWindowTitle(w._name) from graphqt.QIcons import icon # should be imported after QApplication icon.set_icons() w.setWindowIcon(icon.icon_logviewer) w.show() app.exec_() sys.exit(0) #------------------------------