/Demo/tkinter/guido/kill.py

http://unladen-swallow.googlecode.com/ · Python · 98 lines · 89 code · 4 blank · 5 comment · 3 complexity · 3f4994c1c1728ead3a2cb7372fcc1aca MD5 · raw file

  1. #! /usr/bin/env python
  2. # Tkinter interface to Linux `kill' command.
  3. from Tkinter import *
  4. from string import splitfields
  5. from string import split
  6. import commands
  7. import os
  8. class BarButton(Menubutton):
  9. def __init__(self, master=None, **cnf):
  10. apply(Menubutton.__init__, (self, master), cnf)
  11. self.pack(side=LEFT)
  12. self.menu = Menu(self, name='menu')
  13. self['menu'] = self.menu
  14. class Kill(Frame):
  15. # List of (name, option, pid_column)
  16. format_list = [('Default', '', 0),
  17. ('Long', '-l', 2),
  18. ('User', '-u', 1),
  19. ('Jobs', '-j', 1),
  20. ('Signal', '-s', 1),
  21. ('Memory', '-m', 0),
  22. ('VM', '-v', 0),
  23. ('Hex', '-X', 0)]
  24. def kill(self, selected):
  25. c = self.format_list[self.format.get()][2]
  26. pid = split(selected)[c]
  27. os.system('kill -9 ' + pid)
  28. self.do_update()
  29. def do_update(self):
  30. name, option, column = self.format_list[self.format.get()]
  31. s = commands.getoutput('ps -w ' + option)
  32. list = splitfields(s, '\n')
  33. self.header.set(list[0])
  34. del list[0]
  35. y = self.frame.vscroll.get()[0]
  36. self.frame.list.delete(0, AtEnd())
  37. for line in list:
  38. self.frame.list.insert(0, line)
  39. self.frame.list.yview(int(y))
  40. def do_motion(self, e):
  41. e.widget.select_clear(0, END)
  42. e.widget.select_set(e.widget.nearest(e.y))
  43. def do_leave(self, e):
  44. e.widget.select_clear(0, END)
  45. def do_1(self, e):
  46. self.kill(e.widget.get(e.widget.nearest(e.y)))
  47. def __init__(self, master=None, **cnf):
  48. Frame.__init__(self, master, cnf)
  49. self.pack(expand=1, fill=BOTH)
  50. self.bar = Frame(self, name='bar', relief=RAISED,
  51. borderwidth=2)
  52. self.bar.pack(fill=X)
  53. self.bar.file = BarButton(self.bar, text='File')
  54. self.bar.file.menu.add_command(
  55. label='Quit', command=self.quit)
  56. self.bar.view = BarButton(self.bar, text='View')
  57. self.format = IntVar(self)
  58. self.format.set(2)
  59. for num in range(len(self.format_list)):
  60. self.bar.view.menu.add_radiobutton(
  61. label=self.format_list[num][0],
  62. command=self.do_update,
  63. variable=self.format,
  64. value=num)
  65. #self.bar.view.menu.add_separator()
  66. #XXX ...
  67. self.bar.tk_menuBar(self.bar.file, self.bar.view)
  68. self.frame = Frame(self, relief=RAISED, borderwidth=2)
  69. self.frame.pack(expand=1, fill=BOTH)
  70. self.header = StringVar(self)
  71. self.frame.label = Label(self.frame, relief=FLAT, anchor=NW,
  72. borderwidth=0,
  73. textvariable=self.header)
  74. self.frame.label.pack(fill=X)
  75. self.frame.vscroll = Scrollbar(self.frame, orient=VERTICAL)
  76. self.frame.list = Listbox(self.frame, relief=SUNKEN,
  77. selectbackground='#eed5b7',
  78. selectborderwidth=0,
  79. yscroll=self.frame.vscroll.set)
  80. self.frame.vscroll['command'] = self.frame.list.yview
  81. self.frame.vscroll.pack(side=RIGHT, fill=Y)
  82. self.frame.list.pack(expand=1, fill=BOTH)
  83. self.update = Button(self, text="Update",
  84. command=self.do_update)
  85. self.update.pack(expand=1, fill=X)
  86. self.frame.list.bind('<Motion>', self.do_motion)
  87. self.frame.list.bind('<Leave>', self.do_leave)
  88. self.frame.list.bind('<1>', self.do_1)
  89. self.do_update()
  90. if __name__ == '__main__':
  91. kill = Kill(None, borderwidth=5)
  92. kill.winfo_toplevel().title('Tkinter Process Killer')
  93. kill.winfo_toplevel().minsize(1, 1)
  94. kill.mainloop()