1 #! /usr/local/bin/python
3 # Tkinter interface to SYSV `kill' command.
6 from string
import splitfields
7 from string
import split
11 user
= os
.environ
['LOGNAME']
13 class BarButton(Menubutton
):
14 _CNF
= {Pack
: {'side': 'left'}}
15 def __init__(self
, master
=None, cnf
={}):
16 Menubutton
.__init
__(self
, master
, (self
._CNF
, cnf
))
17 self
.menu
= Menu(self
, {'name': 'menu'})
18 self
['menu'] = self
.menu
21 # List of (name, option, pid_column)
25 ('Non process group leaders (-d)', '-d'),
26 ('Non leaders with tty (-a)', '-a'),
27 ('For this user (-u %s)' % user
, '-u %s' % user
),
31 ('Long (-l)', '-l', 3),
32 ('Full (-f)', '-f', 1),
33 ('Full Long (-f -l)', '-l -f', 3),
34 ('Session and group ID (-j)', '-j', 0),
35 ('Scheduler properties (-c)', '-c', 0),
37 def kill(self
, selected
):
38 c
= self
.format_list
[self
.format
.get()][2]
39 pid
= split(selected
)[c
]
40 os
.system('kill' + ' -9 ' + pid
)
43 format
= self
.format_list
[self
.format
.get()][1]
44 view
= self
.view_list
[self
.view
.get()][1]
45 s
= commands
.getoutput('ps %s %s' % (view
, format
))
46 list = splitfields(s
, '\n')
47 self
.header
.set(list[0] + ' ')
49 y
= self
.frame
.vscroll
.get()[2]
50 self
.frame
.list.delete(0, AtEnd())
52 self
.frame
.list.insert(0, line
)
53 self
.frame
.list.yview(y
)
54 def do_motion(self
, e
):
55 e
.widget
.select_from(e
.widget
.nearest(e
.y
))
56 def do_leave(self
, e
):
57 e
.widget
.select_clear()
59 self
.kill(e
.widget
.get(e
.widget
.nearest(e
.y
)))
60 def __init__(self
, master
=None, cnf
={}):
61 Frame
.__init
__(self
, master
, cnf
)
62 self
.pack({'expand': 'yes', 'fill': 'both'})
70 self
.bar
.file = BarButton(self
.bar
, {'text': 'File'})
71 self
.bar
.file.menu
.add_command(
72 {'label': 'Quit', 'command': self
.quit
})
73 self
.bar
.view
= BarButton(self
.bar
, {'text': 'View'})
74 self
.bar
.format
= BarButton(self
.bar
, {'text': 'Format'})
75 self
.view
= IntVar(self
)
77 self
.format
= IntVar(self
)
79 for num
in range(len(self
.view_list
)):
80 label
, option
= self
.view_list
[num
]
81 self
.bar
.view
.menu
.add_radiobutton(
83 'command': self
.do_update
,
84 'variable': self
.view
,
86 for num
in range(len(self
.format_list
)):
87 label
, option
, col
= self
.format_list
[num
]
88 self
.bar
.format
.menu
.add_radiobutton(
90 'command': self
.do_update
,
91 'variable': self
.format
,
93 self
.bar
.tk_menuBar(self
.bar
.file,
98 {'relief': 'raised', 'bd': 2,
102 self
.header
= StringVar(self
)
103 self
.frame
.label
= Label(
108 'font': '*-Courier-Bold-R-Normal-*-120-*',
109 'textvariable': self
.header
,
110 Pack
: {'side': 'top',
113 self
.frame
.vscroll
= Scrollbar(
115 {'orient': 'vertical'})
116 self
.frame
.list = Listbox(
119 'font': '*-Courier-Medium-R-Normal-*-120-*',
121 'selectbackground': '#eed5b7',
122 'selectborderwidth': 0,
123 'yscroll': self
.frame
.vscroll
.set})
124 self
.frame
.vscroll
['command'] = self
.frame
.list.yview
125 self
.frame
.vscroll
.pack({'side': 'right', 'fill': 'y'})
126 self
.frame
.list.pack(
130 self
.update
= Button(
133 'command': self
.do_update
,
134 Pack
: {'expand': 'no',
136 self
.frame
.list.bind('<Motion>', self
.do_motion
)
137 self
.frame
.list.bind('<Leave>', self
.do_leave
)
138 self
.frame
.list.bind('<1>', self
.do_1
)
141 if __name__
== '__main__':
142 kill
= Kill(None, {'bd': 5})
143 kill
.winfo_toplevel().title('Tkinter Process Killer (SYSV)')
144 kill
.winfo_toplevel().minsize(1, 1)