| 
									
										
										
										
											1996-11-27 19:52:01 +00:00
										 |  |  | #! /usr/bin/env python | 
					
						
							| 
									
										
										
										
											1994-07-06 09:26:20 +00:00
										 |  |  | # Tkinter interface to Linux `kill' command. | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | from Tkinter import * | 
					
						
							|  |  |  | from string import splitfields | 
					
						
							|  |  |  | from string import split | 
					
						
							| 
									
										
										
										
											1994-07-06 09:26:20 +00:00
										 |  |  | import commands | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class BarButton(Menubutton): | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 	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 | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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] | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 		os.system('kill -9 ' + pid) | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 		self.do_update() | 
					
						
							|  |  |  | 	def do_update(self): | 
					
						
							|  |  |  | 		name, option, column = self.format_list[self.format.get()] | 
					
						
							| 
									
										
										
										
											1994-07-06 09:26:20 +00:00
										 |  |  | 		s = commands.getoutput('ps -w ' + option) | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 		list = splitfields(s, '\n') | 
					
						
							|  |  |  | 		self.header.set(list[0]) | 
					
						
							|  |  |  | 		del list[0] | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 		y = self.frame.vscroll.get()[0] | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 		self.frame.list.delete(0, AtEnd()) | 
					
						
							|  |  |  | 		for line in list: | 
					
						
							|  |  |  | 			self.frame.list.insert(0, line) | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 		self.frame.list.yview(int(y)) | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 	def do_motion(self, e): | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 		e.widget.select_clear(0, END) | 
					
						
							|  |  |  | 		e.widget.select_set(e.widget.nearest(e.y)) | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 	def do_leave(self, e): | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 		e.widget.select_clear(0, END) | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 	def do_1(self, e): | 
					
						
							|  |  |  | 		self.kill(e.widget.get(e.widget.nearest(e.y))) | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 	def __init__(self, master=None, **cnf): | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 		Frame.__init__(self, master, cnf) | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 		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') | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 		self.bar.file.menu.add_command( | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 			label='Quit', command=self.quit) | 
					
						
							|  |  |  | 		self.bar.view = BarButton(self.bar, text='View') | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 		self.format = IntVar(self) | 
					
						
							|  |  |  | 		self.format.set(2) | 
					
						
							|  |  |  | 		for num in range(len(self.format_list)): | 
					
						
							|  |  |  | 			self.bar.view.menu.add_radiobutton( | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 				label=self.format_list[num][0],  | 
					
						
							|  |  |  | 				command=self.do_update, | 
					
						
							|  |  |  | 				variable=self.format, | 
					
						
							|  |  |  | 				value=num) | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 		#self.bar.view.menu.add_separator() | 
					
						
							|  |  |  | 		#XXX ... | 
					
						
							|  |  |  | 		self.bar.tk_menuBar(self.bar.file, self.bar.view) | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 		self.frame = Frame(self, relief=RAISED, borderwidth=2) | 
					
						
							|  |  |  | 		self.frame.pack(expand=1, fill=BOTH) | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 		self.header = StringVar(self) | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 		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) | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 		self.frame.vscroll['command'] = self.frame.list.yview | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 		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) | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 		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__': | 
					
						
							| 
									
										
										
										
											1996-07-30 18:57:18 +00:00
										 |  |  | 	kill = Kill(None, borderwidth=5) | 
					
						
							| 
									
										
										
										
											1994-06-27 08:00:16 +00:00
										 |  |  | 	kill.winfo_toplevel().title('Tkinter Process Killer') | 
					
						
							|  |  |  | 	kill.winfo_toplevel().minsize(1, 1) | 
					
						
							|  |  |  | 	kill.mainloop() | 
					
						
							|  |  |  | 
 |