PyGTK树列全部重复
我写了一个简单的PyGTK脚本,用来在一个树形视图中显示一些基本的进程信息:
import gtk
import os
import pwd
import grp
class ProcParser:
"""
Parses the status file of a particular process
"""
def __init__(self, fname):
self.lines = map(lambda x: x[:-1], open(fname).readlines())
def get_by_val(self, val):
for line in self.lines:
if line.startswith(val):
return line.split()
return []
class Proc:
"""
A process in the /proc filesystem
This class uses a ProcParser to determine it's own information
"""
def __init__(self, pid):
self.pid = int(pid)
self.parser = ProcParser("/proc/{0}/status".format(self.pid))
self._from_file()
def _from_file(self):
self.uid = self.parser.get_by_val("Uid")[1]
self.gid = self.parser.get_by_val("Gid")[1]
self.name = self.parser.get_by_val("Name")[1]
self.user = pwd.getpwuid(int(self.uid)).pw_name
self.group = grp.getgrgid(int(self.gid)).gr_name
class ProcTree:
"A tree that displays all running processes"
def __init__(self):
self.view = gtk.ScrolledWindow()
self.store = gtk.ListStore(str, int, str, str)
self.tree = gtk.TreeView(self.store)
self.cells = [
gtk.CellRendererText(),
gtk.CellRendererText(),
gtk.CellRendererText(),
gtk.CellRendererText()
]
self.tvcols = [
gtk.TreeViewColumn("Name"),
gtk.TreeViewColumn("Pid"),
gtk.TreeViewColumn("User"),
gtk.TreeViewColumn("Group")
]
def __call__(self):
return self.view
def config(self):
for col, cell in zip(self.tvcols, self.cells):
col.pack_start(cell, True)
col.add_attribute(cell, "text", 0)
self.tree.append_column(col)
self._update_store()
self.view.add_with_viewport(self.tree)
def show(self):
self.tree.show()
self.view.show()
def _update_store(self):
self.store.clear()
for item in os.listdir("/proc"):
try: pwid = int(item)
except: continue
pr = Proc(pwid)
self.store.append((pr.name, int(pr.pid), pr.user, pr.group))
class Window:
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.proctree = ProcTree()
def config(self):
self.proctree.config()
self.window.add(self.proctree())
self.window.set_title("Process Viewer")
def show(self):
self.proctree.show()
self.window.show()
def run(self):
self.config()
self.show()
win = Window()
win.run()
gtk.main()
我遇到的问题是,所有列的值都是一样的。
备注:
- 看起来这个问题和第一列的数据有关(也就是说,如果我改变第一列的数据,其他列的数据也会变成一样的)
(会根据大家的建议再补充更多内容)
1 个回答
4
要在树视图中添加内容,你应该这样做:
rendererText = gtk.CellRendererText()
tvcols = ["Name", "Pid", "User", "Group"]
for num, name in enumerate(tvcols):
column_name = gtk.TreeViewColumn(name ,rendererText, text=num)
self.tree.append_column(column_name)