/Demo/tkinter/guido/svkill.py

http://unladen-swallow.googlecode.com/ · Python · 128 lines · 117 code · 8 blank · 3 comment · 5 complexity · 74fb0b21aa2a8354d2d284d3c79a52fb MD5 · raw file

  1. #! /usr/bin/env python
  2. # Tkinter interface to SYSV `ps' and `kill' commands.
  3. from Tkinter import *
  4. if TkVersion < 4.0:
  5. raise ImportError, "This version of svkill requires Tk 4.0 or later"
  6. from string import splitfields
  7. from string import split
  8. import commands
  9. import os
  10. user = os.environ['LOGNAME']
  11. class BarButton(Menubutton):
  12. def __init__(self, master=None, **cnf):
  13. apply(Menubutton.__init__, (self, master), cnf)
  14. self.pack(side=LEFT)
  15. self.menu = Menu(self, name='menu')
  16. self['menu'] = self.menu
  17. class Kill(Frame):
  18. # List of (name, option, pid_column)
  19. view_list = [
  20. ('Default', ''),
  21. ('Every (-e)', '-e'),
  22. ('Non process group leaders (-d)', '-d'),
  23. ('Non leaders with tty (-a)', '-a'),
  24. ('For this user (-u %s)' % user, '-u %s' % user),
  25. ]
  26. format_list = [
  27. ('Default', '', 0),
  28. ('Long (-l)', '-l', 3),
  29. ('Full (-f)', '-f', 1),
  30. ('Full Long (-f -l)', '-l -f', 3),
  31. ('Session and group ID (-j)', '-j', 0),
  32. ('Scheduler properties (-c)', '-c', 0),
  33. ]
  34. def kill(self, selected):
  35. c = self.format_list[self.format.get()][2]
  36. pid = split(selected)[c]
  37. os.system('kill -9 ' + pid)
  38. self.do_update()
  39. def do_update(self):
  40. format = self.format_list[self.format.get()][1]
  41. view = self.view_list[self.view.get()][1]
  42. s = commands.getoutput('ps %s %s' % (view, format))
  43. list = splitfields(s, '\n')
  44. self.header.set(list[0] + ' ')
  45. del list[0]
  46. self.frame.list.delete(0, AtEnd())
  47. for line in list:
  48. self.frame.list.insert(0, line)
  49. def do_motion(self, e):
  50. e.widget.select_clear('0', 'end')
  51. e.widget.select_set(e.widget.nearest(e.y))
  52. def do_leave(self, e):
  53. e.widget.select_clear('0', 'end')
  54. def do_1(self, e):
  55. self.kill(e.widget.get(e.widget.nearest(e.y)))
  56. def __init__(self, master=None, **cnf):
  57. apply(Frame.__init__, (self, master), cnf)
  58. self.pack(expand=1, fill=BOTH)
  59. self.bar = Frame(self, name='bar', relief=RAISED,
  60. borderwidth=2)
  61. self.bar.pack(fill=X)
  62. self.bar.file = BarButton(self.bar, text='File')
  63. self.bar.file.menu.add_command(
  64. label='Quit', command=self.quit)
  65. self.bar.view = BarButton(self.bar, text='View')
  66. self.bar.format = BarButton(self.bar, text='Format')
  67. self.view = IntVar(self)
  68. self.view.set(0)
  69. self.format = IntVar(self)
  70. self.format.set(0)
  71. for num in range(len(self.view_list)):
  72. label, option = self.view_list[num]
  73. self.bar.view.menu.add_radiobutton(
  74. label=label,
  75. command=self.do_update,
  76. variable=self.view,
  77. value=num)
  78. for num in range(len(self.format_list)):
  79. label, option, col = self.format_list[num]
  80. self.bar.format.menu.add_radiobutton(
  81. label=label,
  82. command=self.do_update,
  83. variable=self.format,
  84. value=num)
  85. self.bar.tk_menuBar(self.bar.file,
  86. self.bar.view,
  87. self.bar.format)
  88. self.frame = Frame(self, relief=RAISED, borderwidth=2)
  89. self.frame.pack(expand=1, fill=BOTH)
  90. self.header = StringVar(self)
  91. self.frame.label = Label(
  92. self.frame, relief=FLAT, anchor=NW, borderwidth=0,
  93. font='*-Courier-Bold-R-Normal-*-120-*',
  94. textvariable=self.header)
  95. self.frame.label.pack(fill=Y, anchor=W)
  96. self.frame.vscroll = Scrollbar(self.frame, orient=VERTICAL)
  97. self.frame.list = Listbox(
  98. self.frame,
  99. relief=SUNKEN,
  100. font='*-Courier-Medium-R-Normal-*-120-*',
  101. width=40, height=10,
  102. selectbackground='#eed5b7',
  103. selectborderwidth=0,
  104. selectmode=BROWSE,
  105. yscroll=self.frame.vscroll.set)
  106. self.frame.vscroll['command'] = self.frame.list.yview
  107. self.frame.vscroll.pack(side=RIGHT, fill=Y)
  108. self.frame.list.pack(expand=1, fill=BOTH)
  109. self.update = Button(self, text='Update',
  110. command=self.do_update)
  111. self.update.pack(fill=X)
  112. self.frame.list.bind('<Motion>', self.do_motion)
  113. self.frame.list.bind('<Leave>', self.do_leave)
  114. self.frame.list.bind('<1>', self.do_1)
  115. self.do_update()
  116. if __name__ == '__main__':
  117. kill = Kill(None, borderwidth=5)
  118. kill.winfo_toplevel().title('Tkinter Process Killer (SYSV)')
  119. kill.winfo_toplevel().minsize(1, 1)
  120. kill.mainloop()