annotate Demo/tkinter/guido/ShellWindow.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents e9b35cc88b50
children 23083bd8c261
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 import os
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 import sys
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 import string
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 from Tkinter import *
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 from ScrolledText import ScrolledText
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 from Dialog import Dialog
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 import signal
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
8
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 BUFSIZE = 512
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 class ShellWindow(ScrolledText):
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
13 def __init__(self, master=None, shell=None, **cnf):
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
14 if not shell:
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 try:
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 shell = os.environ['SHELL']
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 except KeyError:
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 shell = '/bin/sh'
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 shell = shell + ' -i'
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 args = string.split(shell)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 shell = args[0]
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
22
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
23 apply(ScrolledText.__init__, (self, master), cnf)
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 self.pos = '1.0'
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 self.bind('<Return>', self.inputhandler)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 self.bind('<Control-c>', self.sigint)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 self.bind('<Control-t>', self.sigterm)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 self.bind('<Control-k>', self.sigkill)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 self.bind('<Control-d>', self.sendeof)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
30
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 self.pid, self.fromchild, self.tochild = spawn(shell, args)
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
32 self.tk.createfilehandler(self.fromchild, READABLE,
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 self.outputhandler)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
34
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 def outputhandler(self, file, mask):
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 data = os.read(file, BUFSIZE)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 if not data:
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 self.tk.deletefilehandler(file)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 pid, sts = os.waitpid(self.pid, 0)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 print 'pid', pid, 'status', sts
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 self.pid = None
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 detail = sts>>8
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 cause = sts & 0xff
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 if cause == 0:
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 msg = "exit status %d" % detail
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 else:
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 msg = "killed by signal %d" % (cause & 0x7f)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 if cause & 0x80:
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 msg = msg + " -- core dumped"
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
50 Dialog(self.master,
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
51 text=msg,
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
52 title="Exit status",
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
53 bitmap='warning',
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
54 default=0,
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
55 strings=('OK',))
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 return
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
57 self.insert(END, data)
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
58 self.pos = self.index("end - 1 char")
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
59 self.yview_pickplace(END)
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
60
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 def inputhandler(self, *args):
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 if not self.pid:
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
63 self.no_process()
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
64 return "break"
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
65 self.insert(END, "\n")
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
66 line = self.get(self.pos, "end - 1 char")
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
67 self.pos = self.index(END)
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 os.write(self.tochild, line)
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
69 return "break"
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
70
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 def sendeof(self, *args):
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 if not self.pid:
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
73 self.no_process()
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
74 return "break"
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 os.close(self.tochild)
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
76 return "break"
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
77
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 def sendsig(self, sig):
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 if not self.pid:
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
80 self.no_process()
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
81 return "break"
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 os.kill(self.pid, sig)
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
83 return "break"
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
84
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 def sigint(self, *args):
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
86 return self.sendsig(signal.SIGINT)
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
87
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 def sigquit(self, *args):
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
89 return self.sendsig(signal.SIGQUIT)
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
90
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 def sigterm(self, *args):
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
92 return self.sendsig(signal.SIGTERM)
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
93
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 def sigkill(self, *args):
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
95 return self.sendsig(signal.SIGKILL)
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
96
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
97 def no_process(self):
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
98 Dialog(self.master,
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
99 text="No active process",
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
100 title="No process",
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
101 bitmap='error',
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
102 default=0,
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
103 strings=('OK',))
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
104
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 MAXFD = 100 # Max number of file descriptors (os.getdtablesize()???)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
106
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 def spawn(prog, args):
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 p2cread, p2cwrite = os.pipe()
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 c2pread, c2pwrite = os.pipe()
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 pid = os.fork()
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 if pid == 0:
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 # Child
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 os.close(0)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 os.close(1)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 os.close(2)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 if os.dup(p2cread) <> 0:
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 sys.stderr.write('popen2: bad read dup\n')
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 if os.dup(c2pwrite) <> 1:
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 sys.stderr.write('popen2: bad write dup\n')
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 if os.dup(c2pwrite) <> 2:
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 sys.stderr.write('popen2: bad write dup\n')
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 for i in range(3, MAXFD):
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 try:
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 os.close(i)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 except:
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 pass
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 try:
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 os.execvp(prog, args)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 finally:
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
130 sys.stderr.write('execvp failed\n')
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 os._exit(1)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 os.close(p2cread)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 os.close(c2pwrite)
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 return pid, c2pread, p2cwrite
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
135
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 def test():
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 shell = string.join(sys.argv[1:])
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 root = Tk()
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 root.minsize(1, 1)
3867
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
140 if shell:
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
141 w = ShellWindow(root, shell=shell)
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
142 else:
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
143 w = ShellWindow(root)
e9b35cc88b50 Updated for Python 1.4
Guido van Rossum <guido@python.org>
parents: 2119
diff changeset
144 w.pack(expand=1, fill=BOTH)
2119
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 w.focus_set()
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 w.tk.mainloop()
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
147
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 if __name__ == '__main__':
1dae0d3062d2 demonstrate shell in a Tk window
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 test()