log.py 2.44 KB
import gtk

class LogView (gtk.ScrolledWindow) :
    def __init__ (self, max=100) :
        self._len = 0
        self._max = max
        gtk.ScrolledWindow.__init__(self)
        self.set_size_request(-1, 60)
        self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
        self._view = gtk.TextView()
        self.add(self._view)
        self._view.set_editable(gtk.FALSE)
        self._view.set_cursor_visible(gtk.FALSE)
        self._view.set_wrap_mode(gtk.WRAP_NONE)
        self._view.set_justification(gtk.JUSTIFY_LEFT)
        self._buff = self._view.get_buffer()
        self._tag = {}
        for name, color in [("info", "black"), ("error", "darkred"),
                            ("warn", "darkblue"), ("debug", "darkgray")] :
            self._tag[name] = self._buff.create_tag(None, foreground=color)
    def __len__ (self) :
        return self._len
    def clear (self) :
        self._buff.set_text("")
        self._len = 0
    def log (self, line, tag=None) :
        buff = self._buff
        if self._len == self._max :
            start = buff.get_start_iter()
            end = start.copy()
            end.forward_line()
            buff.delete(start, end)
        else :
            self._len += 1
        if self._len > 1 :
            buff.insert(buff.get_end_iter(), "\n")
        pos = buff.create_mark(None, buff.get_end_iter(), gtk.TRUE)
        if tag is None :
            tag = self._tag["info"]
        buff.insert_with_tags(buff.get_end_iter(), line.strip(), tag)
        self._view.scroll_to_mark(pos, 0.0, gtk.TRUE, 0.0, 1.0)
    def info (self, text) :
        for line in text.split("\n") :
            self.log(line, self._tag["info"])
    def error (self, text) :
        for line in text.split("\n") :
            self.log(line, self._tag["error"])
    def warn (self, text) :
        for line in text.split("\n") :
            self.log(line, self._tag["warn"])
    def debug (self, text) :
        for line in text.split("\n") :
            self.log(line, self._tag["debug"])

if __name__ == "__main__" :
    win = gtk.Window()
    def quit (*args) :
        gtk.main_quit()
    win.connect("delete-event", quit)
    box = gtk.VBox()
    win.add(box)
    log = LogView(5)
    box.add(log)
    def click (*args) :
        log.log(args[-1], log._tag[args[-1]])
    for name in ["info", "error", "warn", "debug"] :
        but = gtk.Button(name)
        box.add(but)
        but.connect("clicked", click, name)
    win.show_all()
    gtk.mainloop()