log.py
2.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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()