blob: 44a6b9bcfec621ab0bb978d7d10009e38103c58c [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Guido van Rossume20864d1994-07-06 09:26:20 +00002# Tkinter interface to Linux `kill' command.
Guido van Rossumf7132471994-06-27 08:00:16 +00003
Benjamin Petersond6d63f52009-01-04 18:53:28 +00004from tkinter import *
Brett Cannona23810f2008-05-26 19:04:21 +00005import subprocess
Guido van Rossum89cb67b1996-07-30 18:57:18 +00006import os
Guido van Rossumf7132471994-06-27 08:00:16 +00007
8class BarButton(Menubutton):
Tim Peters182b5ac2004-07-18 06:16:08 +00009 def __init__(self, master=None, **cnf):
Neal Norwitzd9108552006-03-17 08:00:19 +000010 Menubutton.__init__(self, master, **cnf)
Tim Peters182b5ac2004-07-18 06:16:08 +000011 self.pack(side=LEFT)
12 self.menu = Menu(self, name='menu')
13 self['menu'] = self.menu
Guido van Rossumf7132471994-06-27 08:00:16 +000014
15class Kill(Frame):
Tim Peters182b5ac2004-07-18 06:16:08 +000016 # List of (name, option, pid_column)
17 format_list = [('Default', '', 0),
18 ('Long', '-l', 2),
19 ('User', '-u', 1),
20 ('Jobs', '-j', 1),
21 ('Signal', '-s', 1),
22 ('Memory', '-m', 0),
23 ('VM', '-v', 0),
24 ('Hex', '-X', 0)]
25 def kill(self, selected):
26 c = self.format_list[self.format.get()][2]
Georg Brandl0db85e52010-08-02 23:30:09 +000027 pid = selected.split()[c]
Tim Peters182b5ac2004-07-18 06:16:08 +000028 os.system('kill -9 ' + pid)
29 self.do_update()
30 def do_update(self):
31 name, option, column = self.format_list[self.format.get()]
Brett Cannona23810f2008-05-26 19:04:21 +000032 s = subprocess.getoutput('ps -w ' + option)
Georg Brandl0db85e52010-08-02 23:30:09 +000033 list = s.split('\n')
Tim Peters182b5ac2004-07-18 06:16:08 +000034 self.header.set(list[0])
35 del list[0]
36 y = self.frame.vscroll.get()[0]
37 self.frame.list.delete(0, AtEnd())
38 for line in list:
39 self.frame.list.insert(0, line)
40 self.frame.list.yview(int(y))
41 def do_motion(self, e):
42 e.widget.select_clear(0, END)
43 e.widget.select_set(e.widget.nearest(e.y))
44 def do_leave(self, e):
45 e.widget.select_clear(0, END)
46 def do_1(self, e):
47 self.kill(e.widget.get(e.widget.nearest(e.y)))
48 def __init__(self, master=None, **cnf):
49 Frame.__init__(self, master, cnf)
50 self.pack(expand=1, fill=BOTH)
51 self.bar = Frame(self, name='bar', relief=RAISED,
52 borderwidth=2)
53 self.bar.pack(fill=X)
54 self.bar.file = BarButton(self.bar, text='File')
55 self.bar.file.menu.add_command(
56 label='Quit', command=self.quit)
57 self.bar.view = BarButton(self.bar, text='View')
58 self.format = IntVar(self)
59 self.format.set(2)
60 for num in range(len(self.format_list)):
61 self.bar.view.menu.add_radiobutton(
62 label=self.format_list[num][0],
63 command=self.do_update,
64 variable=self.format,
65 value=num)
66 #self.bar.view.menu.add_separator()
67 #XXX ...
68 self.bar.tk_menuBar(self.bar.file, self.bar.view)
69 self.frame = Frame(self, relief=RAISED, borderwidth=2)
70 self.frame.pack(expand=1, fill=BOTH)
71 self.header = StringVar(self)
72 self.frame.label = Label(self.frame, relief=FLAT, anchor=NW,
73 borderwidth=0,
74 textvariable=self.header)
75 self.frame.label.pack(fill=X)
76 self.frame.vscroll = Scrollbar(self.frame, orient=VERTICAL)
77 self.frame.list = Listbox(self.frame, relief=SUNKEN,
78 selectbackground='#eed5b7',
79 selectborderwidth=0,
80 yscroll=self.frame.vscroll.set)
81 self.frame.vscroll['command'] = self.frame.list.yview
82 self.frame.vscroll.pack(side=RIGHT, fill=Y)
83 self.frame.list.pack(expand=1, fill=BOTH)
84 self.update = Button(self, text="Update",
85 command=self.do_update)
86 self.update.pack(expand=1, fill=X)
87 self.frame.list.bind('<Motion>', self.do_motion)
88 self.frame.list.bind('<Leave>', self.do_leave)
89 self.frame.list.bind('<1>', self.do_1)
90 self.do_update()
Guido van Rossumf7132471994-06-27 08:00:16 +000091
92if __name__ == '__main__':
Tim Peters182b5ac2004-07-18 06:16:08 +000093 kill = Kill(None, borderwidth=5)
94 kill.winfo_toplevel().title('Tkinter Process Killer')
95 kill.winfo_toplevel().minsize(1, 1)
96 kill.mainloop()