Don't reference removed files in Makefile
[python/dscho.git] / Demo / tkinter / guido / svkill.py
blobed8a0a703688bea9a09a6b6cd7fe97d749bb179e
1 #! /usr/local/bin/python
3 # Tkinter interface to SYSV `kill' command.
5 from Tkinter import *
6 from string import splitfields
7 from string import split
8 import commands
9 import os
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
20 class Kill(Frame):
21 # List of (name, option, pid_column)
22 view_list = [
23 ('Default', ''),
24 ('Every (-e)', '-e'),
25 ('Non process group leaders (-d)', '-d'),
26 ('Non leaders with tty (-a)', '-a'),
27 ('For this user (-u %s)' % user, '-u %s' % user),
29 format_list = [
30 ('Default', '', 0),
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)
41 self.do_update()
42 def do_update(self):
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] + ' ')
48 del list[0]
49 y = self.frame.vscroll.get()[2]
50 self.frame.list.delete(0, AtEnd())
51 for line in list:
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()
58 def do_1(self, e):
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'})
63 self.bar = Frame(
64 self,
65 {'name': 'bar',
66 'relief': 'raised',
67 'bd': 2,
68 Pack: {'side': 'top',
69 'fill': 'x'}})
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)
76 self.view.set(0)
77 self.format = IntVar(self)
78 self.format.set(0)
79 for num in range(len(self.view_list)):
80 label, option = self.view_list[num]
81 self.bar.view.menu.add_radiobutton(
82 {'label': label,
83 'command': self.do_update,
84 'variable': self.view,
85 'value': num})
86 for num in range(len(self.format_list)):
87 label, option, col = self.format_list[num]
88 self.bar.format.menu.add_radiobutton(
89 {'label': label,
90 'command': self.do_update,
91 'variable': self.format,
92 'value': num})
93 self.bar.tk_menuBar(self.bar.file,
94 self.bar.view,
95 self.bar.format)
96 self.frame = Frame(
97 self,
98 {'relief': 'raised', 'bd': 2,
99 Pack: {'side': 'top',
100 'expand': 'yes',
101 'fill': 'both'}})
102 self.header = StringVar(self)
103 self.frame.label = Label(
104 self.frame,
105 {'relief': 'flat',
106 'anchor': 'nw',
107 'borderwidth': 0,
108 'font': '*-Courier-Bold-R-Normal-*-120-*',
109 'textvariable': self.header,
110 Pack: {'side': 'top',
111 'fill': 'y',
112 'anchor': 'w'}})
113 self.frame.vscroll = Scrollbar(
114 self.frame,
115 {'orient': 'vertical'})
116 self.frame.list = Listbox(
117 self.frame,
118 {'relief': 'sunken',
119 'font': '*-Courier-Medium-R-Normal-*-120-*',
120 'geometry': '40x10',
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(
127 {'side': 'top',
128 'expand': 'yes',
129 'fill': 'both'})
130 self.update = Button(
131 self,
132 {'text': 'Update',
133 'command': self.do_update,
134 Pack: {'expand': 'no',
135 'fill': 'x'}})
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)
139 self.do_update()
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)
145 kill.mainloop()