blob: cee33c9828d6af43f403e4066057041c8d8df260 [file] [log] [blame]
Guido van Rossum18886ab1994-07-08 15:08:55 +00001#!/usr/local/bin/tkpython
2# Tkinter interface to SYSV `kill' command.
3
4from Tkinter import *
5from string import splitfields
6from string import split
7import commands
8import os
9
10user = os.environ['LOGNAME']
11
12class BarButton(Menubutton):
13 _CNF = {Pack: {'side': 'left'}}
14 def __init__(self, master=None, cnf={}):
15 Menubutton.__init__(self, master, (self._CNF, cnf))
16 self.menu = Menu(self, {'name': 'menu'})
17 self['menu'] = self.menu
18
19class Kill(Frame):
20 # List of (name, option, pid_column)
21 view_list = [
22 ('Default', ''),
23 ('Every (-e)', '-e'),
24 ('Non process group leaders (-d)', '-d'),
25 ('Non leaders with tty (-a)', '-a'),
26 ('For this user (-u %s)' % user, '-u %s' % user),
27 ]
28 format_list = [
29 ('Default', '', 0),
30 ('Long (-l)', '-l', 3),
31 ('Full (-f)', '-f', 1),
32 ('Full Long (-f -l)', '-l -f', 3),
33 ('Session and group ID (-j)', '-j', 0),
34 ('Scheduler properties (-c)', '-c', 0),
35 ]
36 def kill(self, selected):
37 c = self.format_list[self.format.get()][2]
38 pid = split(selected)[c]
39 os.system('kill' + ' -9 ' + pid)
40 self.do_update()
41 def do_update(self):
42 format = self.format_list[self.format.get()][1]
43 view = self.view_list[self.view.get()][1]
44 s = commands.getoutput('ps %s %s' % (view, format))
45 list = splitfields(s, '\n')
46 self.header.set(list[0] + ' ')
47 del list[0]
48 y = self.frame.vscroll.get()[2]
49 self.frame.list.delete(0, AtEnd())
50 for line in list:
51 self.frame.list.insert(0, line)
52 self.frame.list.yview(y)
53 def do_motion(self, e):
54 e.widget.select_from(e.widget.nearest(e.y))
55 def do_leave(self, e):
56 e.widget.select_clear()
57 def do_1(self, e):
58 self.kill(e.widget.get(e.widget.nearest(e.y)))
59 def __init__(self, master=None, cnf={}):
60 Frame.__init__(self, master, cnf)
61 self.pack({'expand': 'yes', 'fill': 'both'})
62 self.bar = Frame(
63 self,
64 {'name': 'bar',
65 'relief': 'raised',
66 'bd': 2,
67 Pack: {'side': 'top',
68 'fill': 'x'}})
69 self.bar.file = BarButton(self.bar, {'text': 'File'})
70 self.bar.file.menu.add_command(
71 {'label': 'Quit', 'command': self.quit})
72 self.bar.view = BarButton(self.bar, {'text': 'View'})
73 self.bar.format = BarButton(self.bar, {'text': 'Format'})
74 self.view = IntVar(self)
75 self.view.set(0)
76 self.format = IntVar(self)
77 self.format.set(0)
78 for num in range(len(self.view_list)):
79 label, option = self.view_list[num]
80 self.bar.view.menu.add_radiobutton(
81 {'label': label,
82 'command': self.do_update,
83 'variable': self.view,
84 'value': num})
85 for num in range(len(self.format_list)):
86 label, option, col = self.format_list[num]
87 self.bar.format.menu.add_radiobutton(
88 {'label': label,
89 'command': self.do_update,
90 'variable': self.format,
91 'value': num})
92 self.bar.tk_menuBar(self.bar.file,
93 self.bar.view,
94 self.bar.format)
95 self.frame = Frame(
96 self,
97 {'relief': 'raised', 'bd': 2,
98 Pack: {'side': 'top',
99 'expand': 'yes',
100 'fill': 'both'}})
101 self.header = StringVar(self)
102 self.frame.label = Label(
103 self.frame,
104 {'relief': 'flat',
105 'anchor': 'nw',
106 'borderwidth': 0,
107 'font': '*-Courier-Bold-R-Normal-*-120-*',
108 'textvariable': self.header,
109 Pack: {'side': 'top',
110 'fill': 'y',
111 'anchor': 'w'}})
112 self.frame.vscroll = Scrollbar(
113 self.frame,
114 {'orient': 'vertical'})
115 self.frame.list = Listbox(
116 self.frame,
117 {'relief': 'sunken',
118 'font': '*-Courier-Medium-R-Normal-*-120-*',
119 'geometry': '40x10',
120 'selectbackground': '#eed5b7',
121 'selectborderwidth': 0,
122 'yscroll': self.frame.vscroll.set})
123 self.frame.vscroll['command'] = self.frame.list.yview
124 self.frame.vscroll.pack({'side': 'right', 'fill': 'y'})
125 self.frame.list.pack(
126 {'side': 'top',
127 'expand': 'yes',
128 'fill': 'both'})
129 self.update = Button(
130 self,
131 {'text': 'Update',
132 'command': self.do_update,
133 Pack: {'expand': 'no',
134 'fill': 'x'}})
135 self.frame.list.bind('<Motion>', self.do_motion)
136 self.frame.list.bind('<Leave>', self.do_leave)
137 self.frame.list.bind('<1>', self.do_1)
138 self.do_update()
139
140if __name__ == '__main__':
141 kill = Kill(None, {'bd': 5})
142 kill.winfo_toplevel().title('Tkinter Process Killer (SYSV)')
143 kill.winfo_toplevel().minsize(1, 1)
144 kill.mainloop()