2011-01-24 8 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に関するドキュメントを読んで行を追加し、そのスロットでリフレッシュしてください。スロットは任意のオブジェクトのメソッド(あなたの場合はdef)にすることができます。 – webbi

答えて

0

私は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_() 

しかし、これはおそらくそれを行うには良い方法ではないことに注意してください。 ログファイルをストリーミングしたいかもしれません... 多分もっと経験豊富な人が助けてくれるかもしれません。

関連する問題