[PyQt] graphical file tail

David Boddie david.boddie at met.no
Tue Jun 25 13:22:53 BST 2013


On Mon Jun 24 20:24:25 BST 2013, Eric Frederich wrote:

> I'm trying to tail several files graphically.
> I have been trying to find a way to tail several files in a GUI
> without much luck at all.

[...]

> Basically, I want to graphically tail files and when the GUI closes
> the tail subprocesses are killed.
> Seems like a simple request, but I can't get it right.

I notice that other messages have been talking about solving problems in
your original implementation, but how about trying a different approach?

The simple example below uses QProcess to show the output from a
command. In this case, "tail -f <file>". It will stop the process when the
window is closed, but not the process creating the file, of course.

David


#!/usr/bin/env python

import sys

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

class TailWidget(QTextBrowser):

    def __init__(self, parent = None):
        QTextBrowser.__init__(self, parent)
        self.process = QProcess()
        self.process.readyReadStandardOutput.connect(self.addStdout)
        self.process.readyReadStandardError.connect(self.addStderr)
        self.process.finished.connect(self.stop)
        self.running = False
    
    def start(self, command, arguments):
        if self.running:
            return

        self.running = True
        self.process.start(command, arguments)
    
    def stop(self):
        self.running = False

    def addStdout(self):
        self.append(QString.fromLocal8Bit(self.process.readAllStandardOutput()))

    def addStderr(self):
        self.append(QString.fromLocal8Bit(self.process.readAllStandardError()))

    def closeEvent(self, event):
        if self.running:
            self.process.terminate()
            self.process.waitForFinished(1000)

        event.accept()

if __name__ == "__main__":

    app = QApplication(sys.argv)
    
    if len(app.arguments()) != 2:
        sys.stderr.write("Usage: %s <file>\n" % app.arguments()[0])
        sys.exit(1)
    
    w = TailWidget()
    w.start("tail", ["-f", app.arguments()[1]])
    w.show()
    sys.exit(app.exec_())



More information about the PyQt mailing list