Использование функции просмотра файлов для обновления средства просмотра журнала с использованием PyQt4 - PullRequest
3 голосов
/ 24 января 2011

Я реализовал очень простую программу просмотра журналов в Python, используя PyQt4.

Мне интересно использовать его, чтобы следить за выполнением программы, поэтому представление списка должно обновляться при добавлении новой строки в файл журнала.

Вот моя реализация (без часов):

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class LogEntryModel(QAbstractListModel):
    def __init__(self, logfile, parent=None):
        super(LogEntryModel, self).__init__(parent)
        self.slurp(logfile)

    def rowCount(self, parent=QModelIndex()):
        return len(self.entries)

    def data(self, index, role):
        if index.isValid() and role == Qt.DisplayRole:
            return QVariant(self.entries[index.row()])
        else:
            return QVariant()        

    def slurp(self, logfile):
        self.entries = []        
        with open(logfile, 'rb') as fp:
            for line in fp.readlines():
                tokens = line.strip().split(' : ')
                sender = tokens[2]
                message = tokens[4]
                entry = "%s %s" % (sender, message)
                self.entries.append(entry)

class LogViewerForm(QDialog):
    def __init__(self, logfile, parent=None):
        super(LogViewerForm, self).__init__(parent)

        # build the list widget
        list_label = QLabel(QString("<strong>MoMo</strong> Log Viewer"))
        list_model = LogEntryModel(logfile)        
        self.list_view = QListView()
        self.list_view.setModel(list_model)
        list_label.setBuddy(self.list_view)

        # define the layout
        layout = QVBoxLayout()
        layout.addWidget(list_label)
        layout.addWidget(self.list_view)
        self.setLayout(layout)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = LogViewerForm(sys.argv[1])
    form.show()
    app.exec_()

Как показано, приложение работает должным образом: откройте файл, проанализируйте содержимое (разделите на ' : ' и создайте список) и отобразите список, используя QListView.

Существует класс QFileSystemWatcher, который излучает сигнал fileChanged, но я не знаю, где его connect и как вызвать , добавить строку в данные и обновить представление событие.

Любая помощь?

Спасибо.

1 Ответ

0 голосов
/ 30 января 2011

Я довольно новичок в python и pyqt, но это "работает" здесь:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class LogEntryModel(QAbstractListModel):
    def __init__(self, logfile, parent=None):
        super(LogEntryModel, self).__init__(parent)
        self.slurp(logfile)
        self.logfile = logfile

    def rowCount(self, parent=QModelIndex()):
        return len(self.entries)

    def data(self, index, role):
        if index.isValid() and role == Qt.DisplayRole:
            return QVariant(self.entries[index.row()])
        else:
            return QVariant()

    def slurp(self, logfile):
        self.entries = []
        with open(logfile, 'rb') as fp:
            for line in fp.readlines():
                tokens = line.strip().split(' : ')
                sender = tokens[2]
                message = tokens[4]
                entry = "%s %s" % (sender, message)
                self.entries.append(entry)

class LogViewerForm(QDialog):
    def __init__(self, logfile, parent=None):
        super(LogViewerForm, self).__init__(parent)

        self.watcher = QFileSystemWatcher([logfile], parent=None)
        self.connect(self.watcher, SIGNAL('fileChanged(const QString&)'), self.update_log)

        # build the list widget
        list_label = QLabel(QString("<strong>MoMo</strong> Log Viewer"))
        list_model = LogEntryModel(logfile)
        self.list_model = list_model
        self.list_view = QListView()
        self.list_view.setModel(self.list_model)
        list_label.setBuddy(self.list_view)

        # define the layout
        layout = QVBoxLayout()
        layout.addWidget(list_label)
        layout.addWidget(self.list_view)
        self.setLayout(layout)

    def update_log(self):
        print 'file changed'
        self.list_model.slurp(self.list_model.logfile)
        self.list_view.updateGeometries()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = LogViewerForm(sys.argv[1])
    form.show()
    app.exec_()

Но имейте в виду, что это, вероятно, не очень хороший способ сделать это. Вы могли бы хотеть передать файл журнала ... Может быть, кто-то более опытный может помочь.

...