mirror of
https://github.com/python/cpython.git
synced 2025-10-23 07:02:24 +00:00
Merged revisions 85820,85823,85825,85840,85843-85845,85849-85851,85855,85867,85875,85907-85908,85911,85914 via svnmerge from
svn+ssh://svn.python.org/python/branches/py3k ........ r85820 | georg.brandl | 2010-10-24 16:20:22 +0200 (So, 24 Okt 2010) | 1 line Remove usage of exception indexing. ........ r85823 | georg.brandl | 2010-10-24 16:32:45 +0200 (So, 24 Okt 2010) | 1 line Fix style. ........ r85825 | georg.brandl | 2010-10-24 17:16:02 +0200 (So, 24 Okt 2010) | 1 line Add documentation about the default warnings filters. ........ r85840 | georg.brandl | 2010-10-25 19:50:20 +0200 (Mo, 25 Okt 2010) | 1 line #3018: tkinter demo fixes for py3k. ........ r85843 | georg.brandl | 2010-10-26 08:59:23 +0200 (Di, 26 Okt 2010) | 1 line Markup fix. ........ r85844 | georg.brandl | 2010-10-26 12:39:14 +0200 (Di, 26 Okt 2010) | 1 line Work a bit more on tkinter demos. ........ r85845 | georg.brandl | 2010-10-26 12:42:16 +0200 (Di, 26 Okt 2010) | 1 line faqwiz is removed. ........ r85849 | georg.brandl | 2010-10-26 21:31:06 +0200 (Di, 26 Okt 2010) | 1 line #10200: typo. ........ r85850 | georg.brandl | 2010-10-26 21:58:11 +0200 (Di, 26 Okt 2010) | 1 line #10200: typo. ........ r85851 | georg.brandl | 2010-10-26 22:12:37 +0200 (Di, 26 Okt 2010) | 1 line Fix import. ........ r85855 | georg.brandl | 2010-10-27 09:21:54 +0200 (Mi, 27 Okt 2010) | 1 line Encoding fix. ........ r85867 | georg.brandl | 2010-10-27 22:01:51 +0200 (Mi, 27 Okt 2010) | 1 line Add David. ........ r85875 | georg.brandl | 2010-10-28 10:38:30 +0200 (Do, 28 Okt 2010) | 1 line Fix bytes/str issues in get-remote-certificate.py. ........ r85907 | georg.brandl | 2010-10-29 06:54:13 +0200 (Fr, 29 Okt 2010) | 1 line #10222: fix for overzealous AIX compiler. ........ r85908 | georg.brandl | 2010-10-29 07:22:17 +0200 (Fr, 29 Okt 2010) | 1 line send_bytes obviously needs bytes... ........ r85911 | georg.brandl | 2010-10-29 07:36:28 +0200 (Fr, 29 Okt 2010) | 1 line Fix markup error and update false positive entries from "make suspicious". ........ r85914 | georg.brandl | 2010-10-29 08:17:38 +0200 (Fr, 29 Okt 2010) | 1 line (?:...) is a non-capturing, but still grouping construct. ........
This commit is contained in:
parent
d62ecbf0ba
commit
f55aa80b37
34 changed files with 315 additions and 269 deletions
159
Demo/tkinter/guido/mimeviewer.py
Executable file
159
Demo/tkinter/guido/mimeviewer.py
Executable file
|
@ -0,0 +1,159 @@
|
|||
#! /usr/bin/env python3
|
||||
|
||||
# View a single MIME multipart message.
|
||||
# Display each part as a box.
|
||||
|
||||
import os
|
||||
import sys
|
||||
import getopt
|
||||
import mailbox
|
||||
from tkinter import *
|
||||
from tkinter.scrolledtext import ScrolledText
|
||||
|
||||
MBOXPATH = os.environ['HOME'] + '/Mail'
|
||||
|
||||
class Error(Exception):
|
||||
pass
|
||||
|
||||
def getcurrent(self):
|
||||
"""Return the current message. Raise Error when there is none."""
|
||||
seqs = self.get_sequences()
|
||||
try:
|
||||
return max(seqs['cur'])
|
||||
except (ValueError, KeyError):
|
||||
raise Error("no cur message")
|
||||
|
||||
|
||||
class MimeViewer:
|
||||
def __init__(self, parent, title, msg):
|
||||
self.title = title
|
||||
self.msg = msg
|
||||
self.frame = Frame(parent, {'relief': 'raised', 'bd': 2})
|
||||
self.frame.packing = {'expand': 0, 'fill': 'both'}
|
||||
self.button = Checkbutton(self.frame,
|
||||
{'text': title,
|
||||
'command': self.toggle})
|
||||
self.button.pack({'anchor': 'w'})
|
||||
headertext = []
|
||||
for item in msg.items():
|
||||
headertext.append("%s: %s" % item)
|
||||
headertext = '\n'.join(headertext)
|
||||
height = countlines(headertext, 4)
|
||||
if height:
|
||||
self.htext = ScrolledText(self.frame,
|
||||
{'height': height,
|
||||
'width': 80,
|
||||
'wrap': 'none',
|
||||
'relief': 'raised',
|
||||
'bd': 2})
|
||||
self.htext.packing = {'expand': 1, 'fill': 'both',
|
||||
'after': self.button}
|
||||
self.htext.insert('end', headertext)
|
||||
else:
|
||||
self.htext = Frame(self.frame,
|
||||
{'relief': 'raised', 'bd': 2})
|
||||
self.htext.packing = {'side': 'top',
|
||||
'ipady': 2,
|
||||
'fill': 'x',
|
||||
'after': self.button}
|
||||
body = msg.get_payload()
|
||||
if type(body) == str:
|
||||
self.pad = None
|
||||
height = countlines(body, 10)
|
||||
if height:
|
||||
self.btext = ScrolledText(self.frame,
|
||||
{'height': height,
|
||||
'width': 80,
|
||||
'wrap': 'none',
|
||||
'relief': 'raised',
|
||||
'bd': 2})
|
||||
self.btext.packing = {'expand': 1,
|
||||
'fill': 'both'}
|
||||
self.btext.insert('end', body)
|
||||
else:
|
||||
self.btext = None
|
||||
self.parts = None
|
||||
else:
|
||||
self.pad = Frame(self.frame,
|
||||
{'relief': 'flat', 'bd': 2})
|
||||
self.pad.packing = {'side': 'left', 'ipadx': 10,
|
||||
'fill': 'y', 'after': self.htext}
|
||||
self.parts = []
|
||||
for i in range(len(body)):
|
||||
p = MimeViewer(self.frame,
|
||||
'%s.%d' % (title, i+1),
|
||||
body[i])
|
||||
self.parts.append(p)
|
||||
self.btext = None
|
||||
self.collapsed = 1
|
||||
def pack(self):
|
||||
self.frame.pack(self.frame.packing)
|
||||
def destroy(self):
|
||||
self.frame.destroy()
|
||||
def show(self):
|
||||
if self.collapsed:
|
||||
self.button.invoke()
|
||||
def toggle(self):
|
||||
if self.collapsed:
|
||||
self.explode()
|
||||
else:
|
||||
self.collapse()
|
||||
def collapse(self):
|
||||
self.collapsed = 1
|
||||
for comp in self.htext, self.btext, self.pad:
|
||||
if comp:
|
||||
comp.forget()
|
||||
if self.parts:
|
||||
for part in self.parts:
|
||||
part.frame.forget()
|
||||
self.frame.pack({'expand': 0})
|
||||
def explode(self):
|
||||
self.collapsed = 0
|
||||
for comp in self.htext, self.btext, self.pad:
|
||||
if comp: comp.pack(comp.packing)
|
||||
if self.parts:
|
||||
for part in self.parts:
|
||||
part.pack()
|
||||
self.frame.pack({'expand': 1})
|
||||
|
||||
def countlines(str, limit):
|
||||
i = 0
|
||||
n = 0
|
||||
while n < limit:
|
||||
i = str.find('\n', i)
|
||||
if i < 0: break
|
||||
n = n+1
|
||||
i = i+1
|
||||
return n
|
||||
|
||||
def main():
|
||||
opts, args = getopt.getopt(sys.argv[1:], '')
|
||||
for o, a in opts:
|
||||
pass
|
||||
message = None
|
||||
folder = 'inbox'
|
||||
for arg in args:
|
||||
if arg[:1] == '+':
|
||||
folder = arg[1:]
|
||||
else:
|
||||
message = int(arg)
|
||||
|
||||
mh = mailbox.MH(MBOXPATH)
|
||||
f = mh.get_folder(folder)
|
||||
if message is None:
|
||||
message = getcurrent(f)
|
||||
m = mailbox.MHMessage(f.get(message))
|
||||
|
||||
root = Tk()
|
||||
tk = root.tk
|
||||
|
||||
top = MimeViewer(root, '+%s/%d' % (folder, message), m)
|
||||
top.pack()
|
||||
top.show()
|
||||
|
||||
root.minsize(1, 1)
|
||||
|
||||
tk.mainloop()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Add table
Add a link
Reference in a new issue