2011-01-24 3 views
3

저는 PyQt4를 사용하여 매우 간단한 로그 뷰어를 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입니다.

fileChanged 신호를 방출하는 QFileSystemWatcher 클래스가있다,하지만 난 어떻게 데이터에 행을 추가하고보기 이벤트를 새로 고침 트리거하는 곳을 connect하는 방법을 알고하지 않습니다.

어떤 도움이 필요합니까?

감사합니다.

+0

저는 Qt C++ 라이브러리를 사용했습니다. QFileSystemWatcher 신호를 원하는 슬롯에 연결해야한다고 말하면 파일이 변경 될 때 호출됩니다. 나중에 QListView에 관한 문서를 읽고 행을 추가하고 해당 슬롯에서 새로 고침합니다. 슬롯은 모든 객체의 메소드가 될 수 있음을 기억하십시오. – webbi

답변

0

나는 파이썬과 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_() 

을하지만 그것을 할 수있는 좋은 방법은 아마 아님을주의해야합니다. 로그 파일을 스트리밍 할 수도 있습니다 ... 어쩌면 경험이 많은 사람이 도움이 될 수 있습니다.

관련 문제