| #! /usr/bin/env python |
| # Tkinter interface to Linux `kill' command. |
| |
| from Tkinter import * |
| from string import splitfields |
| from string import split |
| import commands |
| import os |
| |
| class BarButton(Menubutton): |
| def __init__(self, master=None, **cnf): |
| apply(Menubutton.__init__, (self, master), cnf) |
| self.pack(side=LEFT) |
| self.menu = Menu(self, name='menu') |
| self['menu'] = self.menu |
| |
| class Kill(Frame): |
| # List of (name, option, pid_column) |
| format_list = [('Default', '', 0), |
| ('Long', '-l', 2), |
| ('User', '-u', 1), |
| ('Jobs', '-j', 1), |
| ('Signal', '-s', 1), |
| ('Memory', '-m', 0), |
| ('VM', '-v', 0), |
| ('Hex', '-X', 0)] |
| def kill(self, selected): |
| c = self.format_list[self.format.get()][2] |
| pid = split(selected)[c] |
| os.system('kill -9 ' + pid) |
| self.do_update() |
| def do_update(self): |
| name, option, column = self.format_list[self.format.get()] |
| s = commands.getoutput('ps -w ' + option) |
| list = splitfields(s, '\n') |
| self.header.set(list[0]) |
| del list[0] |
| y = self.frame.vscroll.get()[0] |
| self.frame.list.delete(0, AtEnd()) |
| for line in list: |
| self.frame.list.insert(0, line) |
| self.frame.list.yview(int(y)) |
| def do_motion(self, e): |
| e.widget.select_clear(0, END) |
| e.widget.select_set(e.widget.nearest(e.y)) |
| def do_leave(self, e): |
| e.widget.select_clear(0, END) |
| def do_1(self, e): |
| self.kill(e.widget.get(e.widget.nearest(e.y))) |
| def __init__(self, master=None, **cnf): |
| Frame.__init__(self, master, cnf) |
| self.pack(expand=1, fill=BOTH) |
| self.bar = Frame(self, name='bar', relief=RAISED, |
| borderwidth=2) |
| self.bar.pack(fill=X) |
| self.bar.file = BarButton(self.bar, text='File') |
| self.bar.file.menu.add_command( |
| label='Quit', command=self.quit) |
| self.bar.view = BarButton(self.bar, text='View') |
| self.format = IntVar(self) |
| self.format.set(2) |
| for num in range(len(self.format_list)): |
| self.bar.view.menu.add_radiobutton( |
| label=self.format_list[num][0], |
| command=self.do_update, |
| variable=self.format, |
| value=num) |
| #self.bar.view.menu.add_separator() |
| #XXX ... |
| self.bar.tk_menuBar(self.bar.file, self.bar.view) |
| self.frame = Frame(self, relief=RAISED, borderwidth=2) |
| self.frame.pack(expand=1, fill=BOTH) |
| self.header = StringVar(self) |
| self.frame.label = Label(self.frame, relief=FLAT, anchor=NW, |
| borderwidth=0, |
| textvariable=self.header) |
| self.frame.label.pack(fill=X) |
| self.frame.vscroll = Scrollbar(self.frame, orient=VERTICAL) |
| self.frame.list = Listbox(self.frame, relief=SUNKEN, |
| selectbackground='#eed5b7', |
| selectborderwidth=0, |
| yscroll=self.frame.vscroll.set) |
| self.frame.vscroll['command'] = self.frame.list.yview |
| self.frame.vscroll.pack(side=RIGHT, fill=Y) |
| self.frame.list.pack(expand=1, fill=BOTH) |
| self.update = Button(self, text="Update", |
| command=self.do_update) |
| self.update.pack(expand=1, fill=X) |
| self.frame.list.bind('<Motion>', self.do_motion) |
| self.frame.list.bind('<Leave>', self.do_leave) |
| self.frame.list.bind('<1>', self.do_1) |
| self.do_update() |
| |
| if __name__ == '__main__': |
| kill = Kill(None, borderwidth=5) |
| kill.winfo_toplevel().title('Tkinter Process Killer') |
| kill.winfo_toplevel().minsize(1, 1) |
| kill.mainloop() |