mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41: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
				
			
		|  | @ -1,8 +1,7 @@ | ||||||
| CGI Examples | CGI Examples | ||||||
| ------------ | ------------ | ||||||
| 
 | 
 | ||||||
| Here are some example CGI programs.  For a larger example, see | Here are some example CGI programs. | ||||||
| ../../Tools/faqwiz/. |  | ||||||
| 
 | 
 | ||||||
| cgi0.sh -- A shell script to test your server is configured for CGI | cgi0.sh -- A shell script to test your server is configured for CGI | ||||||
| cgi1.py -- A Python script to test your server is configured for CGI | cgi1.py -- A Python script to test your server is configured for CGI | ||||||
|  |  | ||||||
|  | @ -80,7 +80,7 @@ def MDFilter(): | ||||||
|     mdContext = md5() |     mdContext = md5() | ||||||
| 
 | 
 | ||||||
|     while 1: |     while 1: | ||||||
|         data = sys.stdin.read(16) |         data = sys.stdin.read(16).encode() | ||||||
|         if not data: |         if not data: | ||||||
|             break |             break | ||||||
|         mdContext.update(data) |         mdContext.update(data) | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								Demo/tkinter/guido/AttrDialog.py → Demo/tkinter/guido/attr_dialog.py
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										15
									
								
								Demo/tkinter/guido/AttrDialog.py → Demo/tkinter/guido/attr_dialog.py
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							|  | @ -14,6 +14,7 @@ | ||||||
| 
 | 
 | ||||||
| from tkinter import * | from tkinter import * | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| class Option: | class Option: | ||||||
| 
 | 
 | ||||||
|     varclass = StringVar            # May be overridden |     varclass = StringVar            # May be overridden | ||||||
|  | @ -45,6 +46,7 @@ def update(self): | ||||||
|     def set(self, e=None):          # Should be overridden |     def set(self, e=None):          # Should be overridden | ||||||
|         pass |         pass | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| class BooleanOption(Option): | class BooleanOption(Option): | ||||||
| 
 | 
 | ||||||
|     varclass = BooleanVar |     varclass = BooleanVar | ||||||
|  | @ -60,6 +62,7 @@ def addoption(self): | ||||||
|                                  command=self.set) |                                  command=self.set) | ||||||
|         self.button.pack(side=RIGHT) |         self.button.pack(side=RIGHT) | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| class EnumOption(Option): | class EnumOption(Option): | ||||||
| 
 | 
 | ||||||
|     def addoption(self): |     def addoption(self): | ||||||
|  | @ -76,6 +79,7 @@ def addoption(self): | ||||||
|                 value=v, |                 value=v, | ||||||
|                 command=self.set) |                 command=self.set) | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| class StringOption(Option): | class StringOption(Option): | ||||||
| 
 | 
 | ||||||
|     def addoption(self): |     def addoption(self): | ||||||
|  | @ -87,6 +91,7 @@ def addoption(self): | ||||||
|         self.entry.pack(side=RIGHT, fill=X, expand=1) |         self.entry.pack(side=RIGHT, fill=X, expand=1) | ||||||
|         self.entry.bind('<Return>', self.set) |         self.entry.bind('<Return>', self.set) | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| class ReadonlyOption(Option): | class ReadonlyOption(Option): | ||||||
| 
 | 
 | ||||||
|     def addoption(self): |     def addoption(self): | ||||||
|  | @ -94,6 +99,7 @@ def addoption(self): | ||||||
|                            anchor=E) |                            anchor=E) | ||||||
|         self.label.pack(side=RIGHT) |         self.label.pack(side=RIGHT) | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| class Dialog: | class Dialog: | ||||||
| 
 | 
 | ||||||
|     def __init__(self, master): |     def __init__(self, master): | ||||||
|  | @ -120,7 +126,7 @@ def addchoices(self): | ||||||
|                 cl = self.classes[c] |                 cl = self.classes[c] | ||||||
|             except KeyError: |             except KeyError: | ||||||
|                 cl = 'unknown' |                 cl = 'unknown' | ||||||
|             if type(cl) == TupleType: |             if type(cl) is tuple: | ||||||
|                 cl = self.enumoption |                 cl = self.enumoption | ||||||
|             elif cl == 'boolean': |             elif cl == 'boolean': | ||||||
|                 cl = self.booleanoption |                 cl = self.booleanoption | ||||||
|  | @ -140,6 +146,7 @@ def addchoices(self): | ||||||
|     enumoption = EnumOption |     enumoption = EnumOption | ||||||
|     readonlyoption = ReadonlyOption |     readonlyoption = ReadonlyOption | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| class PackDialog(Dialog): | class PackDialog(Dialog): | ||||||
| 
 | 
 | ||||||
|     def __init__(self, widget): |     def __init__(self, widget): | ||||||
|  | @ -248,6 +255,7 @@ class enumoption(remotepackoption, EnumOption): pass | ||||||
|     class stringoption(remotepackoption, StringOption): pass |     class stringoption(remotepackoption, StringOption): pass | ||||||
|     class readonlyoption(remotepackoption, ReadonlyOption): pass |     class readonlyoption(remotepackoption, ReadonlyOption): pass | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| class WidgetDialog(Dialog): | class WidgetDialog(Dialog): | ||||||
| 
 | 
 | ||||||
|     def __init__(self, widget): |     def __init__(self, widget): | ||||||
|  | @ -357,6 +365,7 @@ class readonlyoption(widgetoption, ReadonlyOption): pass | ||||||
|             'Slider': _bistate, |             'Slider': _bistate, | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| class RemoteWidgetDialog(WidgetDialog): | class RemoteWidgetDialog(WidgetDialog): | ||||||
| 
 | 
 | ||||||
|     def __init__(self, master, app, widget): |     def __init__(self, master, app, widget): | ||||||
|  | @ -407,6 +416,7 @@ class enumoption(remotewidgetoption, EnumOption): pass | ||||||
|     class stringoption(remotewidgetoption, StringOption): pass |     class stringoption(remotewidgetoption, StringOption): pass | ||||||
|     class readonlyoption(remotewidgetoption, ReadonlyOption): pass |     class readonlyoption(remotewidgetoption, ReadonlyOption): pass | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| def test(): | def test(): | ||||||
|     import sys |     import sys | ||||||
|     root = Tk() |     root = Tk() | ||||||
|  | @ -435,12 +445,11 @@ def remotetest(root, app): | ||||||
|     list.app = app                  # Pass it on to handler |     list.app = app                  # Pass it on to handler | ||||||
| 
 | 
 | ||||||
| def opendialogs(e): | def opendialogs(e): | ||||||
|     import string |  | ||||||
|     list = e.widget |     list = e.widget | ||||||
|     sel = list.curselection() |     sel = list.curselection() | ||||||
|     for i in sel: |     for i in sel: | ||||||
|         item = list.get(i) |         item = list.get(i) | ||||||
|         widget = string.split(item)[0] |         widget = item.split()[0] | ||||||
|         RemoteWidgetDialog(list, list.app, widget) |         RemoteWidgetDialog(list, list.app, widget) | ||||||
|         if widget == '.': continue |         if widget == '.': continue | ||||||
|         try: |         try: | ||||||
|  | @ -1,15 +1,41 @@ | ||||||
| #! /usr/bin/env python | #! /usr/bin/env python | ||||||
| 
 | 
 | ||||||
| from tkinter import * | from tkinter import * | ||||||
| from Canvas import Oval, Group, CanvasText |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Fix a bug in Canvas.Group as distributed in Python 1.4.  The | # Since Canvas.Group is no longer present, the following class reproduces | ||||||
| # distributed bind() method is broken.  This is what should be used: | # a subset of the old Group class that is used by this app. | ||||||
|  | 
 | ||||||
|  | class Group: | ||||||
|  |     def __init__(self, canvas, tag=None): | ||||||
|  |         if tag is None: | ||||||
|  |             tag = 'Group%d' % id(self) | ||||||
|  | 
 | ||||||
|  |         self.tag = self.id = tag | ||||||
|  |         self.canvas = canvas | ||||||
|  |         self.canvas.dtag(self.tag) | ||||||
|  | 
 | ||||||
|  |     def __str__(self): | ||||||
|  |         return self.tag | ||||||
|  | 
 | ||||||
|  |     def _do(self, cmd, *args): | ||||||
|  |         return self.canvas.tk.call(self.canvas._w, cmd, self.tag, *args) | ||||||
|  | 
 | ||||||
|  |     def addtag_withtag(self, tagOrId): | ||||||
|  |         self._do('addtag', 'withtag', tagOrId) | ||||||
|  | 
 | ||||||
|  |     def bind(self, sequence=None, command=None, add=None): | ||||||
|  |         return self.canvas.tag_bind(self.id, sequence, command, add) | ||||||
|  | 
 | ||||||
|  |     def move(self, x_amount, y_amount): | ||||||
|  |         self._do('move', x_amount, y_amount) | ||||||
|  | 
 | ||||||
|  |     def dtag(self, tagToDelete=None): | ||||||
|  |         self._do('dtag', tagToDelete) | ||||||
|  | 
 | ||||||
|  |     def tkraise(self, aboveThis=None): | ||||||
|  |         self._do('raise', aboveThis) | ||||||
| 
 | 
 | ||||||
| class Group(Group): |  | ||||||
|     def bind(self, sequence=None, command=None): |  | ||||||
|         return self.canvas.tag_bind(self.id, sequence, command) |  | ||||||
| 
 | 
 | ||||||
| class Object: | class Object: | ||||||
| 
 | 
 | ||||||
|  | @ -29,7 +55,6 @@ class Object: | ||||||
| 
 | 
 | ||||||
|     All instance attributes are public since the derived class may |     All instance attributes are public since the derived class may | ||||||
|     need them. |     need them. | ||||||
| 
 |  | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
|     def __init__(self, canvas, x=0, y=0, fill='red', text='object'): |     def __init__(self, canvas, x=0, y=0, fill='red', text='object'): | ||||||
|  | @ -44,12 +69,10 @@ def __str__(self): | ||||||
|         return str(self.group) |         return str(self.group) | ||||||
| 
 | 
 | ||||||
|     def createitems(self, fill, text): |     def createitems(self, fill, text): | ||||||
|         self.__oval = Oval(self.canvas, |         self.__oval = self.canvas.create_oval(self.x - 20, self.y - 10, | ||||||
|                            self.x-20, self.y-10, self.x+20, self.y+10, |             self.x + 20, self.y + 20, fill=fill, width=3) | ||||||
|                            fill=fill, width=3) |  | ||||||
|         self.group.addtag_withtag(self.__oval) |         self.group.addtag_withtag(self.__oval) | ||||||
|         self.__text = CanvasText(self.canvas, |         self.__text = self.canvas.create_text(self.x, self.y, text=text) | ||||||
|                            self.x, self.y, text=text) |  | ||||||
|         self.group.addtag_withtag(self.__text) |         self.group.addtag_withtag(self.__text) | ||||||
| 
 | 
 | ||||||
|     def moveby(self, dx, dy): |     def moveby(self, dx, dy): | ||||||
|  | @ -75,18 +98,15 @@ def tkraise(self): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Bottom(Object): | class Bottom(Object): | ||||||
| 
 |  | ||||||
|     """An object to serve as the bottom of a pile.""" |     """An object to serve as the bottom of a pile.""" | ||||||
| 
 | 
 | ||||||
|     def createitems(self, *args): |     def createitems(self, *args): | ||||||
|         self.__oval = Oval(self.canvas, |         self.__oval = self.canvas.create_oval(self.x - 20, self.y - 10, | ||||||
|                            self.x-20, self.y-10, self.x+20, self.y+10, |             self.x + 20, self.y + 10, fill='gray', outline='') | ||||||
|                            fill='gray', outline='') |  | ||||||
|         self.group.addtag_withtag(self.__oval) |         self.group.addtag_withtag(self.__oval) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Pile: | class Pile: | ||||||
| 
 |  | ||||||
|     """A group of graphical objects.""" |     """A group of graphical objects.""" | ||||||
| 
 | 
 | ||||||
|     def __init__(self, canvas, x, y, tag=None): |     def __init__(self, canvas, x, y, tag=None): | ||||||
|  |  | ||||||
|  | @ -24,8 +24,7 @@ def dialog(master, title, text, bitmap, default, *args): | ||||||
| 
 | 
 | ||||||
|     # 2. Fill the top part with the bitmap and message. |     # 2. Fill the top part with the bitmap and message. | ||||||
| 
 | 
 | ||||||
|     msg = Message(top, width='3i', text=text, |     msg = Message(top, width='3i', text=text) | ||||||
|                   font='-Adobe-Times-Medium-R-Normal-*-180-*') |  | ||||||
|     msg.pack(side=RIGHT, expand=1, fill=BOTH, padx='3m', pady='3m') |     msg.pack(side=RIGHT, expand=1, fill=BOTH, padx='3m', pady='3m') | ||||||
|     if bitmap: |     if bitmap: | ||||||
|         bm = Label(top, bitmap=bitmap) |         bm = Label(top, bitmap=bitmap) | ||||||
|  |  | ||||||
|  | @ -62,11 +62,11 @@ def run(self): | ||||||
| 
 | 
 | ||||||
| # Main program | # Main program | ||||||
| def main(): | def main(): | ||||||
|     import sys, string |     import sys | ||||||
| 
 | 
 | ||||||
|     # First argument is number of electrons, default 30 |     # First argument is number of electrons, default 30 | ||||||
|     if sys.argv[1:]: |     if sys.argv[1:]: | ||||||
|         n = string.atoi(sys.argv[1]) |         n = int(sys.argv[1]) | ||||||
|     else: |     else: | ||||||
|         n = 30 |         n = 30 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -125,11 +125,11 @@ def report(self, i, a, b): | ||||||
| 
 | 
 | ||||||
| # Main program | # Main program | ||||||
| def main(): | def main(): | ||||||
|     import sys, string |     import sys | ||||||
| 
 | 
 | ||||||
|     # First argument is number of pegs, default 4 |     # First argument is number of pegs, default 4 | ||||||
|     if sys.argv[1:]: |     if sys.argv[1:]: | ||||||
|         n = string.atoi(sys.argv[1]) |         n = int(sys.argv[1]) | ||||||
|     else: |     else: | ||||||
|         n = 4 |         n = 4 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,7 +1,6 @@ | ||||||
| # List a remote app's widget tree (names and classes only) | # List a remote app's widget tree (names and classes only) | ||||||
| 
 | 
 | ||||||
| import sys | import sys | ||||||
| import string |  | ||||||
| 
 | 
 | ||||||
| from tkinter import * | from tkinter import * | ||||||
| 
 | 
 | ||||||
|  | @ -13,8 +12,6 @@ def listtree(master, app): | ||||||
| 
 | 
 | ||||||
| def listnodes(list, app, widget, level): | def listnodes(list, app, widget, level): | ||||||
|     klass = list.send(app, 'winfo', 'class', widget) |     klass = list.send(app, 'winfo', 'class', widget) | ||||||
| ##      i = string.rindex(widget, '.') |  | ||||||
| ##      list.insert(END, '%s%s (%s)' % ((level-1)*'.   ', widget[i:], klass)) |  | ||||||
|     list.insert(END, '%s (%s)' % (widget, klass)) |     list.insert(END, '%s (%s)' % (widget, klass)) | ||||||
|     children = list.tk.splitlist( |     children = list.tk.splitlist( | ||||||
|             list.send(app, 'winfo', 'children', widget)) |             list.send(app, 'winfo', 'children', widget)) | ||||||
|  |  | ||||||
							
								
								
									
										81
									
								
								Demo/tkinter/guido/ManPage.py → Demo/tkinter/guido/manpage.py
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										81
									
								
								Demo/tkinter/guido/ManPage.py → Demo/tkinter/guido/manpage.py
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							|  | @ -1,13 +1,12 @@ | ||||||
| # Widget to display a man page | # Widget to display a man page | ||||||
| 
 | 
 | ||||||
|  | import os | ||||||
| import re | import re | ||||||
| from tkinter import * | import sys | ||||||
| from tkinter import _tkinter |  | ||||||
| from tkinter.scrolledtext import ScrolledText |  | ||||||
| 
 | 
 | ||||||
| # XXX These fonts may have to be changed to match your system | from tkinter import * | ||||||
| BOLDFONT = '*-Courier-Bold-R-Normal-*-120-*' | from tkinter.font import Font | ||||||
| ITALICFONT = '*-Courier-Medium-O-Normal-*-120-*' | from tkinter.scrolledtext import ScrolledText | ||||||
| 
 | 
 | ||||||
| # XXX Recognizing footers is system dependent | # XXX Recognizing footers is system dependent | ||||||
| # (This one works for IRIX 5.2 and Solaris 2.2) | # (This one works for IRIX 5.2 and Solaris 2.2) | ||||||
|  | @ -16,64 +15,64 @@ | ||||||
| emptyprog = re.compile('^[ \t]*\n') | emptyprog = re.compile('^[ \t]*\n') | ||||||
| ulprog = re.compile('^[ \t]*[Xv!_][Xv!_ \t]*\n') | ulprog = re.compile('^[ \t]*[Xv!_][Xv!_ \t]*\n') | ||||||
| 
 | 
 | ||||||
| # Basic Man Page class -- does not disable editing |  | ||||||
| class EditableManPage(ScrolledText): |  | ||||||
| 
 | 
 | ||||||
|     # Initialize instance | class EditableManPage(ScrolledText): | ||||||
|  |     """Basic Man Page class -- does not disable editing.""" | ||||||
|  | 
 | ||||||
|     def __init__(self, master=None, **cnf): |     def __init__(self, master=None, **cnf): | ||||||
|         # Initialize base class |  | ||||||
|         ScrolledText.__init__(self, master, **cnf) |         ScrolledText.__init__(self, master, **cnf) | ||||||
| 
 | 
 | ||||||
|  |         bold = Font(font=self['font']).copy() | ||||||
|  |         bold.config(weight='bold') | ||||||
|  |         italic = Font(font=self['font']).copy() | ||||||
|  |         italic.config(slant='italic') | ||||||
|  | 
 | ||||||
|         # Define tags for formatting styles |         # Define tags for formatting styles | ||||||
|         self.tag_config('X', underline=1) |         self.tag_config('X', underline=1) | ||||||
|         self.tag_config('!', font=BOLDFONT) |         self.tag_config('!', font=bold) | ||||||
|         self.tag_config('_', font=ITALICFONT) |         self.tag_config('_', font=italic) | ||||||
| 
 | 
 | ||||||
|         # Set state to idle |         # Set state to idle | ||||||
|         self.fp = None |         self.fp = None | ||||||
|         self.lineno = 0 |         self.lineno = 0 | ||||||
| 
 | 
 | ||||||
|     # Test whether we are busy parsing a file |  | ||||||
|     def busy(self): |     def busy(self): | ||||||
|  |         """Test whether we are busy parsing a file.""" | ||||||
|         return self.fp != None |         return self.fp != None | ||||||
| 
 | 
 | ||||||
|     # Ensure we're not busy |  | ||||||
|     def kill(self): |     def kill(self): | ||||||
|  |         """Ensure we're not busy.""" | ||||||
|         if self.busy(): |         if self.busy(): | ||||||
|             self._endparser() |             self._endparser() | ||||||
| 
 | 
 | ||||||
|     # Parse a file, in the background |  | ||||||
|     def asyncparsefile(self, fp): |     def asyncparsefile(self, fp): | ||||||
|  |         """Parse a file, in the background.""" | ||||||
|         self._startparser(fp) |         self._startparser(fp) | ||||||
|         self.tk.createfilehandler(fp, _tkinter.READABLE, |         self.tk.createfilehandler(fp, READABLE, | ||||||
|                                   self._filehandler) |                                   self._filehandler) | ||||||
| 
 | 
 | ||||||
|     parsefile = asyncparsefile      # Alias |     parsefile = asyncparsefile   # Alias | ||||||
| 
 | 
 | ||||||
|     # I/O handler used by background parsing |  | ||||||
|     def _filehandler(self, fp, mask): |     def _filehandler(self, fp, mask): | ||||||
|  |         """I/O handler used by background parsing.""" | ||||||
|         nextline = self.fp.readline() |         nextline = self.fp.readline() | ||||||
|         if not nextline: |         if not nextline: | ||||||
|             self._endparser() |             self._endparser() | ||||||
|             return |             return | ||||||
|         self._parseline(nextline) |         self._parseline(nextline) | ||||||
| 
 | 
 | ||||||
|     # Parse a file, now (cannot be aborted) |  | ||||||
|     def syncparsefile(self, fp): |     def syncparsefile(self, fp): | ||||||
|         from select import select |         """Parse a file, now (cannot be aborted).""" | ||||||
|         def avail(fp=fp, tout=0.0, select=select): |  | ||||||
|             return select([fp], [], [], tout)[0] |  | ||||||
|         height = self.getint(self['height']) |  | ||||||
|         self._startparser(fp) |         self._startparser(fp) | ||||||
|         while 1: |         while True: | ||||||
|             nextline = fp.readline() |             nextline = fp.readline() | ||||||
|             if not nextline: |             if not nextline: | ||||||
|                 break |                 break | ||||||
|             self._parseline(nextline) |             self._parseline(nextline) | ||||||
|         self._endparser() |         self._endparser() | ||||||
| 
 | 
 | ||||||
|     # Initialize parsing from a particular file -- must not be busy |  | ||||||
|     def _startparser(self, fp): |     def _startparser(self, fp): | ||||||
|  |         """Initialize parsing from a particular file -- must not be busy.""" | ||||||
|         if self.busy(): |         if self.busy(): | ||||||
|             raise RuntimeError('startparser: still busy') |             raise RuntimeError('startparser: still busy') | ||||||
|         fp.fileno()             # Test for file-ness |         fp.fileno()             # Test for file-ness | ||||||
|  | @ -87,33 +86,33 @@ def _startparser(self, fp): | ||||||
|         self.delete('1.0', END) |         self.delete('1.0', END) | ||||||
|         self['state'] = savestate |         self['state'] = savestate | ||||||
| 
 | 
 | ||||||
|     # End parsing -- must be busy, need not be at EOF |  | ||||||
|     def _endparser(self): |     def _endparser(self): | ||||||
|  |         """End parsing -- must be busy, need not be at EOF.""" | ||||||
|         if not self.busy(): |         if not self.busy(): | ||||||
|             raise RuntimeError('endparser: not busy') |             raise RuntimeError('endparser: not busy') | ||||||
|         if self.buffer: |         if self.buffer: | ||||||
|             self._parseline('') |             self._parseline('') | ||||||
|         try: |         try: | ||||||
|             self.tk.deletefilehandler(self.fp) |             self.tk.deletefilehandler(self.fp) | ||||||
|         except TclError as msg: |         except TclError: | ||||||
|             pass |             pass | ||||||
|         self.fp.close() |         self.fp.close() | ||||||
|         self.fp = None |         self.fp = None | ||||||
|         del self.ok, self.empty, self.buffer |         del self.ok, self.empty, self.buffer | ||||||
| 
 | 
 | ||||||
|     # Parse a single line |  | ||||||
|     def _parseline(self, nextline): |     def _parseline(self, nextline): | ||||||
|  |         """Parse a single line.""" | ||||||
|         if not self.buffer: |         if not self.buffer: | ||||||
|             # Save this line -- we need one line read-ahead |             # Save this line -- we need one line read-ahead | ||||||
|             self.buffer = nextline |             self.buffer = nextline | ||||||
|             return |             return | ||||||
|         if emptyprog.match(self.buffer) >= 0: |         if emptyprog.match(self.buffer): | ||||||
|             # Buffered line was empty -- set a flag |             # Buffered line was empty -- set a flag | ||||||
|             self.empty = 1 |             self.empty = 1 | ||||||
|             self.buffer = nextline |             self.buffer = nextline | ||||||
|             return |             return | ||||||
|         textline = self.buffer |         textline = self.buffer | ||||||
|         if ulprog.match(nextline) >= 0: |         if ulprog.match(nextline): | ||||||
|             # Next line is properties for buffered line |             # Next line is properties for buffered line | ||||||
|             propline = nextline |             propline = nextline | ||||||
|             self.buffer = None |             self.buffer = None | ||||||
|  | @ -127,7 +126,7 @@ def _parseline(self, nextline): | ||||||
|             self.ok = 1 |             self.ok = 1 | ||||||
|             self.empty = 0 |             self.empty = 0 | ||||||
|             return |             return | ||||||
|         if footerprog.match(textline) >= 0: |         if footerprog.match(textline): | ||||||
|             # Footer -- start skipping until next non-blank line |             # Footer -- start skipping until next non-blank line | ||||||
|             self.ok = 0 |             self.ok = 0 | ||||||
|             self.empty = 0 |             self.empty = 0 | ||||||
|  | @ -161,8 +160,8 @@ def _parseline(self, nextline): | ||||||
|         self.lineno = self.lineno + 1 |         self.lineno = self.lineno + 1 | ||||||
|         self['state'] = savestate |         self['state'] = savestate | ||||||
| 
 | 
 | ||||||
|     # Insert a string at the end, with at most one property (tag) |  | ||||||
|     def _insert_prop(self, str, prop = ' '): |     def _insert_prop(self, str, prop = ' '): | ||||||
|  |         """Insert a string at the end, with at most one property (tag).""" | ||||||
|         here = self.index(AtInsert()) |         here = self.index(AtInsert()) | ||||||
|         self.insert(AtInsert(), str) |         self.insert(AtInsert(), str) | ||||||
|         if TkVersion <= 4.0: |         if TkVersion <= 4.0: | ||||||
|  | @ -172,10 +171,10 @@ def _insert_prop(self, str, prop = ' '): | ||||||
|         if prop != ' ': |         if prop != ' ': | ||||||
|             self.tag_add(prop, here, AtInsert()) |             self.tag_add(prop, here, AtInsert()) | ||||||
| 
 | 
 | ||||||
| # Readonly Man Page class -- disables editing, otherwise the same |  | ||||||
| class ReadonlyManPage(EditableManPage): |  | ||||||
| 
 | 
 | ||||||
|     # Initialize instance | class ReadonlyManPage(EditableManPage): | ||||||
|  |     """Readonly Man Page class -- disables editing, otherwise the same.""" | ||||||
|  | 
 | ||||||
|     def __init__(self, master=None, **cnf): |     def __init__(self, master=None, **cnf): | ||||||
|         cnf['state'] = DISABLED |         cnf['state'] = DISABLED | ||||||
|         EditableManPage.__init__(self, master, **cnf) |         EditableManPage.__init__(self, master, **cnf) | ||||||
|  | @ -183,14 +182,11 @@ def __init__(self, master=None, **cnf): | ||||||
| # Alias | # Alias | ||||||
| ManPage = ReadonlyManPage | ManPage = ReadonlyManPage | ||||||
| 
 | 
 | ||||||
| # Test program. |  | ||||||
| # usage: ManPage [manpage]; or ManPage [-f] file | # usage: ManPage [manpage]; or ManPage [-f] file | ||||||
| # -f means that the file is nroff -man output run through ul -i | # -f means that the file is nroff -man output run through ul -i | ||||||
| def test(): | def main(): | ||||||
|     import os |  | ||||||
|     import sys |  | ||||||
|     # XXX This directory may be different on your system |     # XXX This directory may be different on your system | ||||||
|     MANDIR = '/usr/local/man/mann' |     MANDIR = '' | ||||||
|     DEFAULTPAGE = 'Tcl' |     DEFAULTPAGE = 'Tcl' | ||||||
|     formatted = 0 |     formatted = 0 | ||||||
|     if sys.argv[1:] and sys.argv[1] == '-f': |     if sys.argv[1:] and sys.argv[1] == '-f': | ||||||
|  | @ -211,10 +207,9 @@ def test(): | ||||||
|     if formatted: |     if formatted: | ||||||
|         fp = open(name, 'r') |         fp = open(name, 'r') | ||||||
|     else: |     else: | ||||||
|         fp = os.popen('nroff -man %s | ul -i' % name, 'r') |         fp = os.popen('nroff -man -c %s | ul -i' % name, 'r') | ||||||
|     manpage.parsefile(fp) |     manpage.parsefile(fp) | ||||||
|     root.mainloop() |     root.mainloop() | ||||||
| 
 | 
 | ||||||
| # Run the test program when called as a script |  | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
|     test() |     main() | ||||||
|  | @ -3,17 +3,15 @@ | ||||||
| # Scan MH folder, display results in window | # Scan MH folder, display results in window | ||||||
| 
 | 
 | ||||||
| import os | import os | ||||||
| import sys |  | ||||||
| import re | import re | ||||||
|  | import sys | ||||||
| import getopt | import getopt | ||||||
| import string | import mailbox | ||||||
| import mhlib |  | ||||||
| 
 |  | ||||||
| from tkinter import * | from tkinter import * | ||||||
| 
 | 
 | ||||||
| from dialog import dialog | from dialog import dialog | ||||||
| 
 | 
 | ||||||
| mailbox = os.environ['HOME'] + '/Mail' | MBOXPATH = os.environ['HOME'] + '/Mail' | ||||||
| 
 | 
 | ||||||
| def main(): | def main(): | ||||||
|     global root, tk, top, mid, bot |     global root, tk, top, mid, bot | ||||||
|  | @ -38,8 +36,8 @@ def main(): | ||||||
| 
 | 
 | ||||||
|     # Initialize MH |     # Initialize MH | ||||||
| 
 | 
 | ||||||
|     mh = mhlib.MH() |     mh = mailbox.MH(MBOXPATH) | ||||||
|     mhf = mh.openfolder(folder) |     mhf = mh.get_folder(folder) | ||||||
| 
 | 
 | ||||||
|     # Build widget hierarchy |     # Build widget hierarchy | ||||||
| 
 | 
 | ||||||
|  | @ -171,7 +169,7 @@ def open_folder(e=None): | ||||||
|         return |         return | ||||||
|     i = sel[0] |     i = sel[0] | ||||||
|     folder = folderbox.get(i) |     folder = folderbox.get(i) | ||||||
|     mhf = mh.openfolder(folder) |     mhf = mh.get_folder(folder) | ||||||
|     rescan() |     rescan() | ||||||
| 
 | 
 | ||||||
| def open_message(e=None): | def open_message(e=None): | ||||||
|  | @ -189,11 +187,12 @@ def open_message(e=None): | ||||||
|     tk.call('update', 'idletasks') |     tk.call('update', 'idletasks') | ||||||
|     i = sel[0] |     i = sel[0] | ||||||
|     line = scanbox.get(i) |     line = scanbox.get(i) | ||||||
|     if scanparser.match(line) >= 0: |     m = scanparser.match(line) | ||||||
|         num = string.atoi(scanparser.group(1)) |     if m: | ||||||
|         m = mhf.openmessage(num) |         num = int(m.group(1)) | ||||||
|  |         m = mhf.get_message(num) | ||||||
|         if viewer: viewer.destroy() |         if viewer: viewer.destroy() | ||||||
|         from MimeViewer import MimeViewer |         from mimeviewer import MimeViewer | ||||||
|         viewer = MimeViewer(bot, '+%s/%d' % (folder, num), m) |         viewer = MimeViewer(bot, '+%s/%d' % (folder, num), m) | ||||||
|         viewer.pack() |         viewer.pack() | ||||||
|         viewer.show() |         viewer.show() | ||||||
|  | @ -212,9 +211,11 @@ def remove_message(e=None): | ||||||
|     todo = [] |     todo = [] | ||||||
|     for i in sel: |     for i in sel: | ||||||
|         line = scanbox.get(i) |         line = scanbox.get(i) | ||||||
|         if scanparser.match(line) >= 0: |         m = scanparser.match(line) | ||||||
|             todo.append(string.atoi(scanparser.group(1))) |         if m: | ||||||
|     mhf.removemessages(todo) |             toremove = int(m.group(1)) | ||||||
|  |             todo.append(toremove) | ||||||
|  |             mhf.remove(toremove) | ||||||
|     rescan() |     rescan() | ||||||
|     fixfocus(min(todo), itop) |     fixfocus(min(todo), itop) | ||||||
| 
 | 
 | ||||||
|  | @ -240,12 +241,13 @@ def refile_message(e=None): | ||||||
|     todo = [] |     todo = [] | ||||||
|     for i in sel: |     for i in sel: | ||||||
|         line = scanbox.get(i) |         line = scanbox.get(i) | ||||||
|         if scanparser.match(line) >= 0: |         m = scanparser.match(line) | ||||||
|             todo.append(string.atoi(scanparser.group(1))) |         if m: | ||||||
|  |             todo.append(int(m.group(1))) | ||||||
|     if lastrefile != refileto or not tofolder: |     if lastrefile != refileto or not tofolder: | ||||||
|         lastrefile = refileto |         lastrefile = refileto | ||||||
|         tofolder = None |         tofolder = None | ||||||
|         tofolder = mh.openfolder(lastrefile) |         tofolder = mh.get_folder(lastrefile) | ||||||
|     mhf.refilemessages(todo, tofolder) |     mhf.refilemessages(todo, tofolder) | ||||||
|     rescan() |     rescan() | ||||||
|     fixfocus(min(todo), itop) |     fixfocus(min(todo), itop) | ||||||
|  | @ -254,18 +256,18 @@ def fixfocus(near, itop): | ||||||
|     n = scanbox.size() |     n = scanbox.size() | ||||||
|     for i in range(n): |     for i in range(n): | ||||||
|         line = scanbox.get(repr(i)) |         line = scanbox.get(repr(i)) | ||||||
|         if scanparser.match(line) >= 0: |         m = scanparser.match(line) | ||||||
|             num = string.atoi(scanparser.group(1)) |         if m: | ||||||
|  |             num = int(m.group(1)) | ||||||
|             if num >= near: |             if num >= near: | ||||||
|                 break |                 break | ||||||
|     else: |     else: | ||||||
|         i = 'end' |         i = 'end' | ||||||
|     scanbox.select_from(i) |  | ||||||
|     scanbox.yview(itop) |     scanbox.yview(itop) | ||||||
| 
 | 
 | ||||||
| def setfolders(): | def setfolders(): | ||||||
|     folderbox.delete(0, 'end') |     folderbox.delete(0, 'end') | ||||||
|     for fn in mh.listallfolders(): |     for fn in mh.list_folders(): | ||||||
|         folderbox.insert('end', fn) |         folderbox.insert('end', fn) | ||||||
| 
 | 
 | ||||||
| def rescan(): | def rescan(): | ||||||
|  | @ -278,6 +280,7 @@ def rescan(): | ||||||
|         scanbox.insert('end', line) |         scanbox.insert('end', line) | ||||||
| 
 | 
 | ||||||
| def scanfolder(folder = 'inbox', sequence = 'all'): | def scanfolder(folder = 'inbox', sequence = 'all'): | ||||||
|     return [line[:-1] for line in os.popen('scan +%s %s' % (folder, sequence), 'r').readlines()] |     return [line[:-1] for line in | ||||||
|  |             os.popen('scan +%s %s' % (folder, sequence), 'r').readlines()] | ||||||
| 
 | 
 | ||||||
| main() | main() | ||||||
|  |  | ||||||
|  | @ -1,13 +1,29 @@ | ||||||
| #! /usr/bin/env python | #! /usr/bin/env python3 | ||||||
| 
 | 
 | ||||||
| # View a single MIME multipart message. | # View a single MIME multipart message. | ||||||
| # Display each part as a box. | # Display each part as a box. | ||||||
| 
 | 
 | ||||||
| import string | import os | ||||||
| from types import * | import sys | ||||||
|  | import getopt | ||||||
|  | import mailbox | ||||||
| from tkinter import * | from tkinter import * | ||||||
| from tkinter.scrolledtext import ScrolledText | 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: | class MimeViewer: | ||||||
|     def __init__(self, parent, title, msg): |     def __init__(self, parent, title, msg): | ||||||
|         self.title = title |         self.title = title | ||||||
|  | @ -18,8 +34,10 @@ def __init__(self, parent, title, msg): | ||||||
|                              {'text': title, |                              {'text': title, | ||||||
|                               'command': self.toggle}) |                               'command': self.toggle}) | ||||||
|         self.button.pack({'anchor': 'w'}) |         self.button.pack({'anchor': 'w'}) | ||||||
|         headertext = msg.getheadertext( |         headertext = [] | ||||||
|                 lambda x: x != 'received' and x[:5] != 'x400-') |         for item in msg.items(): | ||||||
|  |             headertext.append("%s: %s" % item) | ||||||
|  |         headertext = '\n'.join(headertext) | ||||||
|         height = countlines(headertext, 4) |         height = countlines(headertext, 4) | ||||||
|         if height: |         if height: | ||||||
|             self.htext = ScrolledText(self.frame, |             self.htext = ScrolledText(self.frame, | ||||||
|  | @ -38,8 +56,8 @@ def __init__(self, parent, title, msg): | ||||||
|                                   'ipady': 2, |                                   'ipady': 2, | ||||||
|                                   'fill': 'x', |                                   'fill': 'x', | ||||||
|                                   'after': self.button} |                                   'after': self.button} | ||||||
|         body = msg.getbody() |         body = msg.get_payload() | ||||||
|         if type(body) == StringType: |         if type(body) == str: | ||||||
|             self.pad = None |             self.pad = None | ||||||
|             height = countlines(body, 10) |             height = countlines(body, 10) | ||||||
|             if height: |             if height: | ||||||
|  | @ -102,16 +120,13 @@ def countlines(str, limit): | ||||||
|     i = 0 |     i = 0 | ||||||
|     n = 0 |     n = 0 | ||||||
|     while  n < limit: |     while  n < limit: | ||||||
|         i = string.find(str, '\n', i) |         i = str.find('\n', i) | ||||||
|         if i < 0: break |         if i < 0: break | ||||||
|         n = n+1 |         n = n+1 | ||||||
|         i = i+1 |         i = i+1 | ||||||
|     return n |     return n | ||||||
| 
 | 
 | ||||||
| def main(): | def main(): | ||||||
|     import sys |  | ||||||
|     import getopt |  | ||||||
|     import mhlib |  | ||||||
|     opts, args = getopt.getopt(sys.argv[1:], '') |     opts, args = getopt.getopt(sys.argv[1:], '') | ||||||
|     for o, a in opts: |     for o, a in opts: | ||||||
|         pass |         pass | ||||||
|  | @ -121,13 +136,13 @@ def main(): | ||||||
|         if arg[:1] == '+': |         if arg[:1] == '+': | ||||||
|             folder = arg[1:] |             folder = arg[1:] | ||||||
|         else: |         else: | ||||||
|             message = string.atoi(arg) |             message = int(arg) | ||||||
| 
 | 
 | ||||||
|     mh = mhlib.MH() |     mh = mailbox.MH(MBOXPATH) | ||||||
|     f = mh.openfolder(folder) |     f = mh.get_folder(folder) | ||||||
|     if not message: |     if message is None: | ||||||
|         message = f.getcurrent() |         message = getcurrent(f) | ||||||
|     m = f.openmessage(message) |     m = mailbox.MHMessage(f.get(message)) | ||||||
| 
 | 
 | ||||||
|     root = Tk() |     root = Tk() | ||||||
|     tk = root.tk |     tk = root.tk | ||||||
|  | @ -140,4 +155,5 @@ def main(): | ||||||
| 
 | 
 | ||||||
|     tk.mainloop() |     tk.mainloop() | ||||||
| 
 | 
 | ||||||
| if __name__ == '__main__': main() | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
|  | @ -28,7 +28,7 @@ | ||||||
| s.pack(side=RIGHT, fill=Y) | s.pack(side=RIGHT, fill=Y) | ||||||
| t = Text(f, relief=RAISED, borderwidth=2, yscrollcommand=s.set, setgrid=1) | t = Text(f, relief=RAISED, borderwidth=2, yscrollcommand=s.set, setgrid=1) | ||||||
| t.pack(side=LEFT, fill=BOTH, expand=1) | t.pack(side=LEFT, fill=BOTH, expand=1) | ||||||
| t.tag_config('bold', font='-Adobe-Courier-Bold-R-Normal-*-120-*') | t.tag_config('bold') | ||||||
| s['command'] = t.yview | s['command'] = t.yview | ||||||
| 
 | 
 | ||||||
| root.title('Tk Remote Controller') | root.title('Tk Remote Controller') | ||||||
|  |  | ||||||
							
								
								
									
										9
									
								
								Demo/tkinter/guido/ShellWindow.py → Demo/tkinter/guido/shell_window.py
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										9
									
								
								Demo/tkinter/guido/ShellWindow.py → Demo/tkinter/guido/shell_window.py
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							|  | @ -1,6 +1,5 @@ | ||||||
| import os | import os | ||||||
| import sys | import sys | ||||||
| import string |  | ||||||
| from tkinter import * | from tkinter import * | ||||||
| from tkinter.scrolledtext import ScrolledText | from tkinter.scrolledtext import ScrolledText | ||||||
| from tkinter.dialog import Dialog | from tkinter.dialog import Dialog | ||||||
|  | @ -17,7 +16,7 @@ def __init__(self, master=None, shell=None, **cnf): | ||||||
|             except KeyError: |             except KeyError: | ||||||
|                 shell = '/bin/sh' |                 shell = '/bin/sh' | ||||||
|             shell = shell + ' -i' |             shell = shell + ' -i' | ||||||
|         args = string.split(shell) |         args = shell.split() | ||||||
|         shell = args[0] |         shell = args[0] | ||||||
| 
 | 
 | ||||||
|         ScrolledText.__init__(self, master, **cnf) |         ScrolledText.__init__(self, master, **cnf) | ||||||
|  | @ -33,7 +32,7 @@ def __init__(self, master=None, shell=None, **cnf): | ||||||
|                                   self.outputhandler) |                                   self.outputhandler) | ||||||
| 
 | 
 | ||||||
|     def outputhandler(self, file, mask): |     def outputhandler(self, file, mask): | ||||||
|         data = os.read(file, BUFSIZE) |         data = os.read(file, BUFSIZE).decode() | ||||||
|         if not data: |         if not data: | ||||||
|             self.tk.deletefilehandler(file) |             self.tk.deletefilehandler(file) | ||||||
|             pid, sts = os.waitpid(self.pid, 0) |             pid, sts = os.waitpid(self.pid, 0) | ||||||
|  | @ -65,7 +64,7 @@ def inputhandler(self, *args): | ||||||
|         self.insert(END, "\n") |         self.insert(END, "\n") | ||||||
|         line = self.get(self.pos, "end - 1 char") |         line = self.get(self.pos, "end - 1 char") | ||||||
|         self.pos = self.index(END) |         self.pos = self.index(END) | ||||||
|         os.write(self.tochild, line) |         os.write(self.tochild, line.encode()) | ||||||
|         return "break" |         return "break" | ||||||
| 
 | 
 | ||||||
|     def sendeof(self, *args): |     def sendeof(self, *args): | ||||||
|  | @ -132,7 +131,7 @@ def spawn(prog, args): | ||||||
|     return pid, c2pread, p2cwrite |     return pid, c2pread, p2cwrite | ||||||
| 
 | 
 | ||||||
| def test(): | def test(): | ||||||
|     shell = string.join(sys.argv[1:]) |     shell = ' '.join(sys.argv[1: ]) | ||||||
|     root = Tk() |     root = Tk() | ||||||
|     root.minsize(1, 1) |     root.minsize(1, 1) | ||||||
|     if shell: |     if shell: | ||||||
|  | @ -22,20 +22,10 @@ | ||||||
| 
 | 
 | ||||||
| # Imports | # Imports | ||||||
| 
 | 
 | ||||||
| import math |  | ||||||
| import random | import random | ||||||
| 
 | 
 | ||||||
| from tkinter import * | from tkinter import * | ||||||
| from Canvas import Rectangle, CanvasText, Group, Window | from canvasevents import Group | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # Fix a bug in Canvas.Group as distributed in Python 1.4.  The |  | ||||||
| # distributed bind() method is broken.  Rather than asking you to fix |  | ||||||
| # the source, we fix it here by deriving a subclass: |  | ||||||
| 
 |  | ||||||
| class Group(Group): |  | ||||||
|     def bind(self, sequence=None, command=None): |  | ||||||
|         return self.canvas.tag_bind(self.id, sequence, command) |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Constants determining the size and lay-out of cards and stacks.  We | # Constants determining the size and lay-out of cards and stacks.  We | ||||||
|  | @ -165,20 +155,22 @@ def __init__(self, suit, value, canvas): | ||||||
|         self.face_shown = 0 |         self.face_shown = 0 | ||||||
| 
 | 
 | ||||||
|         self.x = self.y = 0 |         self.x = self.y = 0 | ||||||
|  |         self.canvas = canvas | ||||||
|         self.group = Group(canvas) |         self.group = Group(canvas) | ||||||
| 
 | 
 | ||||||
|         text = "%s  %s" % (VALNAMES[value], suit) |         text = "%s  %s" % (VALNAMES[value], suit) | ||||||
|         self.__text = CanvasText(canvas, CARDWIDTH//2, 0, |         self.__text = canvas.create_text(CARDWIDTH // 2, 0, anchor=N, | ||||||
|                                anchor=N, fill=self.color, text=text) |                                          fill=self.color, text=text) | ||||||
|         self.group.addtag_withtag(self.__text) |         self.group.addtag_withtag(self.__text) | ||||||
| 
 | 
 | ||||||
|         self.__rect = Rectangle(canvas, 0, 0, CARDWIDTH, CARDHEIGHT, |         self.__rect = canvas.create_rectangle(0, 0, CARDWIDTH, CARDHEIGHT, | ||||||
|                               outline='black', fill='white') |                                               outline='black', fill='white') | ||||||
|         self.group.addtag_withtag(self.__rect) |         self.group.addtag_withtag(self.__rect) | ||||||
| 
 | 
 | ||||||
|         self.__back = Rectangle(canvas, MARGIN, MARGIN, |         self.__back = canvas.create_rectangle(MARGIN, MARGIN, | ||||||
|                               CARDWIDTH-MARGIN, CARDHEIGHT-MARGIN, |                                               CARDWIDTH - MARGIN, | ||||||
|                               outline='black', fill='blue') |                                               CARDHEIGHT - MARGIN, | ||||||
|  |                                               outline='black', fill='blue') | ||||||
|         self.group.addtag_withtag(self.__back) |         self.group.addtag_withtag(self.__back) | ||||||
| 
 | 
 | ||||||
|     def __repr__(self): |     def __repr__(self): | ||||||
|  | @ -202,15 +194,15 @@ def tkraise(self): | ||||||
|     def showface(self): |     def showface(self): | ||||||
|         """Turn the card's face up.""" |         """Turn the card's face up.""" | ||||||
|         self.tkraise() |         self.tkraise() | ||||||
|         self.__rect.tkraise() |         self.canvas.tag_raise(self.__rect) | ||||||
|         self.__text.tkraise() |         self.canvas.tag_raise(self.__text) | ||||||
|         self.face_shown = 1 |         self.face_shown = 1 | ||||||
| 
 | 
 | ||||||
|     def showback(self): |     def showback(self): | ||||||
|         """Turn the card's face down.""" |         """Turn the card's face down.""" | ||||||
|         self.tkraise() |         self.tkraise() | ||||||
|         self.__rect.tkraise() |         self.canvas.tag_raise(self.__rect) | ||||||
|         self.__back.tkraise() |         self.canvas.tag_raise(self.__back) | ||||||
|         self.face_shown = 0 |         self.face_shown = 0 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -400,10 +392,9 @@ class Deck(Stack): | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
|     def makebottom(self): |     def makebottom(self): | ||||||
|         bottom = Rectangle(self.game.canvas, |         bottom = self.game.canvas.create_rectangle(self.x, self.y, | ||||||
|                            self.x, self.y, |             self.x + CARDWIDTH, self.y + CARDHEIGHT, outline='black', | ||||||
|                            self.x+CARDWIDTH, self.y+CARDHEIGHT, |             fill=BACKGROUND) | ||||||
|                            outline='black', fill=BACKGROUND) |  | ||||||
|         self.group.addtag_withtag(bottom) |         self.group.addtag_withtag(bottom) | ||||||
| 
 | 
 | ||||||
|     def fill(self): |     def fill(self): | ||||||
|  | @ -435,7 +426,7 @@ def userclickhandler(self): | ||||||
| 
 | 
 | ||||||
| def randperm(n): | def randperm(n): | ||||||
|     """Function returning a random permutation of range(n).""" |     """Function returning a random permutation of range(n).""" | ||||||
|     r = range(n) |     r = list(range(n)) | ||||||
|     x = [] |     x = [] | ||||||
|     while r: |     while r: | ||||||
|         i = random.choice(r) |         i = random.choice(r) | ||||||
|  | @ -478,10 +469,8 @@ def userdoubleclickhandler(self): | ||||||
| class SuitStack(OpenStack): | class SuitStack(OpenStack): | ||||||
| 
 | 
 | ||||||
|     def makebottom(self): |     def makebottom(self): | ||||||
|         bottom = Rectangle(self.game.canvas, |         bottom = self.game.canvas.create_rectangle(self.x, self.y, | ||||||
|                            self.x, self.y, |             self.x + CARDWIDTH, self.y + CARDHEIGHT, outline='black', fill='') | ||||||
|                            self.x+CARDWIDTH, self.y+CARDHEIGHT, |  | ||||||
|                            outline='black', fill='') |  | ||||||
| 
 | 
 | ||||||
|     def userclickhandler(self): |     def userclickhandler(self): | ||||||
|         pass |         pass | ||||||
|  | @ -540,8 +529,8 @@ def __init__(self, master): | ||||||
|                                  background=BACKGROUND, |                                  background=BACKGROUND, | ||||||
|                                  activebackground="green", |                                  activebackground="green", | ||||||
|                                  command=self.deal) |                                  command=self.deal) | ||||||
|         Window(self.canvas, MARGIN, 3*YSPACING + 20, |         self.canvas.create_window(MARGIN, 3 * YSPACING + 20, | ||||||
|                window=self.dealbutton, anchor=SW) |             window=self.dealbutton, anchor=SW) | ||||||
| 
 | 
 | ||||||
|         x = MARGIN |         x = MARGIN | ||||||
|         y = MARGIN |         y = MARGIN | ||||||
|  |  | ||||||
|  | @ -18,9 +18,7 @@ | ||||||
| 
 | 
 | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| from tkinter import * | from tkinter import * | ||||||
| from Canvas import Line, Rectangle |  | ||||||
| import random | import random | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -31,6 +29,9 @@ | ||||||
| 
 | 
 | ||||||
| class Array: | class Array: | ||||||
| 
 | 
 | ||||||
|  |     class Cancelled(BaseException): | ||||||
|  |         pass | ||||||
|  | 
 | ||||||
|     def __init__(self, master, data=None): |     def __init__(self, master, data=None): | ||||||
|         self.master = master |         self.master = master | ||||||
|         self.frame = Frame(self.master) |         self.frame = Frame(self.master) | ||||||
|  | @ -41,9 +42,9 @@ def __init__(self, master, data=None): | ||||||
|         self.canvas.pack() |         self.canvas.pack() | ||||||
|         self.report = Label(self.frame) |         self.report = Label(self.frame) | ||||||
|         self.report.pack() |         self.report.pack() | ||||||
|         self.left = Line(self.canvas, 0, 0, 0, 0) |         self.left = self.canvas.create_line(0, 0, 0, 0) | ||||||
|         self.right = Line(self.canvas, 0, 0, 0, 0) |         self.right = self.canvas.create_line(0, 0, 0, 0) | ||||||
|         self.pivot = Line(self.canvas, 0, 0, 0, 0) |         self.pivot = self.canvas.create_line(0, 0, 0, 0) | ||||||
|         self.items = [] |         self.items = [] | ||||||
|         self.size = self.maxvalue = 0 |         self.size = self.maxvalue = 0 | ||||||
|         if data: |         if data: | ||||||
|  | @ -82,8 +83,6 @@ def step(self): | ||||||
|         if self.in_mainloop: |         if self.in_mainloop: | ||||||
|             self.master.quit() |             self.master.quit() | ||||||
| 
 | 
 | ||||||
|     Cancelled = "Array.Cancelled"       # Exception |  | ||||||
| 
 |  | ||||||
|     def wait(self, msecs): |     def wait(self, msecs): | ||||||
|         if self.speed == "fastest": |         if self.speed == "fastest": | ||||||
|             msecs = 0 |             msecs = 0 | ||||||
|  | @ -110,15 +109,15 @@ def show_partition(self, first, last): | ||||||
|         for i in range(self.size): |         for i in range(self.size): | ||||||
|             item = self.items[i] |             item = self.items[i] | ||||||
|             if first <= i < last: |             if first <= i < last: | ||||||
|                 item.item.config(fill='red') |                 self.canvas.itemconfig(item, fill='red') | ||||||
|             else: |             else: | ||||||
|                 item.item.config(fill='orange') |                 self.canvas.itemconfig(item, fill='orange') | ||||||
|         self.hide_left_right_pivot() |         self.hide_left_right_pivot() | ||||||
| 
 | 
 | ||||||
|     def hide_partition(self): |     def hide_partition(self): | ||||||
|         for i in range(self.size): |         for i in range(self.size): | ||||||
|             item = self.items[i] |             item = self.items[i] | ||||||
|             item.item.config(fill='red') |             self.canvas.itemconfig(item, fill='red') | ||||||
|         self.hide_left_right_pivot() |         self.hide_left_right_pivot() | ||||||
| 
 | 
 | ||||||
|     def show_left(self, left): |     def show_left(self, left): | ||||||
|  | @ -127,7 +126,7 @@ def show_left(self, left): | ||||||
|             return |             return | ||||||
|         x1, y1, x2, y2 = self.items[left].position() |         x1, y1, x2, y2 = self.items[left].position() | ||||||
| ##      top, bot = HIRO | ##      top, bot = HIRO | ||||||
|         self.left.coords([(x1-2, 0), (x1-2, 9999)]) |         self.canvas.coords(self.left, (x1 - 2, 0, x1 - 2, 9999)) | ||||||
|         self.master.update() |         self.master.update() | ||||||
| 
 | 
 | ||||||
|     def show_right(self, right): |     def show_right(self, right): | ||||||
|  | @ -135,7 +134,7 @@ def show_right(self, right): | ||||||
|             self.hide_right() |             self.hide_right() | ||||||
|             return |             return | ||||||
|         x1, y1, x2, y2 = self.items[right].position() |         x1, y1, x2, y2 = self.items[right].position() | ||||||
|         self.right.coords(((x2+2, 0), (x2+2, 9999))) |         self.canvas.coords(self.right, (x2 + 2, 0, x2 + 2, 9999)) | ||||||
|         self.master.update() |         self.master.update() | ||||||
| 
 | 
 | ||||||
|     def hide_left_right_pivot(self): |     def hide_left_right_pivot(self): | ||||||
|  | @ -144,17 +143,17 @@ def hide_left_right_pivot(self): | ||||||
|         self.hide_pivot() |         self.hide_pivot() | ||||||
| 
 | 
 | ||||||
|     def hide_left(self): |     def hide_left(self): | ||||||
|         self.left.coords(((0, 0), (0, 0))) |         self.canvas.coords(self.left, (0, 0, 0, 0)) | ||||||
| 
 | 
 | ||||||
|     def hide_right(self): |     def hide_right(self): | ||||||
|         self.right.coords(((0, 0), (0, 0))) |         self.canvas.coords(self.right, (0, 0, 0, 0)) | ||||||
| 
 | 
 | ||||||
|     def show_pivot(self, pivot): |     def show_pivot(self, pivot): | ||||||
|         x1, y1, x2, y2 = self.items[pivot].position() |         x1, y1, x2, y2 = self.items[pivot].position() | ||||||
|         self.pivot.coords(((0, y1-2), (9999, y1-2))) |         self.canvas.coords(self.pivot, (0, y1 - 2, 9999, y1 - 2)) | ||||||
| 
 | 
 | ||||||
|     def hide_pivot(self): |     def hide_pivot(self): | ||||||
|         self.pivot.coords(((0, 0), (0, 0))) |         self.canvas.coords(self.pivot, (0, 0, 0, 0)) | ||||||
| 
 | 
 | ||||||
|     def swap(self, i, j): |     def swap(self, i, j): | ||||||
|         if i == j: return |         if i == j: return | ||||||
|  | @ -199,28 +198,30 @@ def __init__(self, array, index, value): | ||||||
|         self.array = array |         self.array = array | ||||||
|         self.index = index |         self.index = index | ||||||
|         self.value = value |         self.value = value | ||||||
|  |         self.canvas = array.canvas | ||||||
|         x1, y1, x2, y2 = self.position() |         x1, y1, x2, y2 = self.position() | ||||||
|         self.item = Rectangle(array.canvas, x1, y1, x2, y2, |         self.item_id = array.canvas.create_rectangle(x1, y1, x2, y2, | ||||||
|                               fill='red', outline='black', width=1) |             fill='red', outline='black', width=1) | ||||||
|         self.item.bind('<Button-1>', self.mouse_down) |         self.canvas.tag_bind(self.item_id, '<Button-1>', self.mouse_down) | ||||||
|         self.item.bind('<Button1-Motion>', self.mouse_move) |         self.canvas.tag_bind(self.item_id, '<Button1-Motion>', self.mouse_move) | ||||||
|         self.item.bind('<ButtonRelease-1>', self.mouse_up) |         self.canvas.tag_bind(self.item_id, '<ButtonRelease-1>', self.mouse_up) | ||||||
| 
 | 
 | ||||||
|     def delete(self): |     def delete(self): | ||||||
|         item = self.item |         item_id = self.item_id | ||||||
|         self.array = None |         self.array = None | ||||||
|         self.item = None |         self.item_id = None | ||||||
|         item.delete() |         self.canvas.delete(item_id) | ||||||
| 
 | 
 | ||||||
|     def mouse_down(self, event): |     def mouse_down(self, event): | ||||||
|         self.lastx = event.x |         self.lastx = event.x | ||||||
|         self.lasty = event.y |         self.lasty = event.y | ||||||
|         self.origx = event.x |         self.origx = event.x | ||||||
|         self.origy = event.y |         self.origy = event.y | ||||||
|         self.item.tkraise() |         self.canvas.tag_raise(self.item_id) | ||||||
| 
 | 
 | ||||||
|     def mouse_move(self, event): |     def mouse_move(self, event): | ||||||
|         self.item.move(event.x - self.lastx, event.y - self.lasty) |         self.canvas.move(self.item_id, | ||||||
|  |                          event.x - self.lastx, event.y - self.lasty) | ||||||
|         self.lastx = event.x |         self.lastx = event.x | ||||||
|         self.lasty = event.y |         self.lasty = event.y | ||||||
| 
 | 
 | ||||||
|  | @ -235,7 +236,7 @@ def mouse_up(self, event): | ||||||
|         self.array.items[here], self.array.items[i] = other, self |         self.array.items[here], self.array.items[i] = other, self | ||||||
|         self.index = i |         self.index = i | ||||||
|         x1, y1, x2, y2 = self.position() |         x1, y1, x2, y2 = self.position() | ||||||
|         self.item.coords(((x1, y1), (x2, y2))) |         self.canvas.coords(self.item_id, (x1, y1, x2, y2)) | ||||||
|         other.setindex(here) |         other.setindex(here) | ||||||
| 
 | 
 | ||||||
|     def setindex(self, index): |     def setindex(self, index): | ||||||
|  | @ -247,9 +248,9 @@ def setindex(self, index): | ||||||
|         self.index = index |         self.index = index | ||||||
|         newpts = self.position() |         newpts = self.position() | ||||||
|         trajectory = interpolate(oldpts, newpts, nsteps) |         trajectory = interpolate(oldpts, newpts, nsteps) | ||||||
|         self.item.tkraise() |         self.canvas.tag_raise(self.item_id) | ||||||
|         for pts in trajectory: |         for pts in trajectory: | ||||||
|             self.item.coords((pts[:2], pts[2:])) |             self.canvas.coords(self.item_id, pts) | ||||||
|             self.array.wait(50) |             self.array.wait(50) | ||||||
| 
 | 
 | ||||||
|     def swapwith(self, other): |     def swapwith(self, other): | ||||||
|  | @ -262,61 +263,63 @@ def swapwith(self, other): | ||||||
|         self.index, other.index = other.index, self.index |         self.index, other.index = other.index, self.index | ||||||
|         mynewpts = self.position() |         mynewpts = self.position() | ||||||
|         othernewpts = other.position() |         othernewpts = other.position() | ||||||
|         myfill = self.item['fill'] |         myfill = self.canvas.itemcget(self.item_id, 'fill') | ||||||
|         otherfill = other.item['fill'] |         otherfill = self.canvas.itemcget(other.item_id, 'fill') | ||||||
|         self.item.config(fill='green') |         self.canvas.itemconfig(self.item_id, fill='green') | ||||||
|         other.item.config(fill='yellow') |         self.canvas.itemconfig(other.item_id, fill='yellow') | ||||||
|         self.array.master.update() |         self.array.master.update() | ||||||
|         if self.array.speed == "single-step": |         if self.array.speed == "single-step": | ||||||
|             self.item.coords((mynewpts[:2], mynewpts[2:])) |             self.canvas.coords(self.item_id, mynewpts) | ||||||
|             other.item.coords((othernewpts[:2], othernewpts[2:])) |             self.canvas.coords(other.item_id, othernewpts) | ||||||
|             self.array.master.update() |             self.array.master.update() | ||||||
|             self.item.config(fill=myfill) |             self.canvas.itemconfig(self.item_id, fill=myfill) | ||||||
|             other.item.config(fill=otherfill) |             self.canvas.itemconfig(other.item_id, fill=otherfill) | ||||||
|             self.array.wait(0) |             self.array.wait(0) | ||||||
|             return |             return | ||||||
|         mytrajectory = interpolate(myoldpts, mynewpts, nsteps) |         mytrajectory = interpolate(myoldpts, mynewpts, nsteps) | ||||||
|         othertrajectory = interpolate(otheroldpts, othernewpts, nsteps) |         othertrajectory = interpolate(otheroldpts, othernewpts, nsteps) | ||||||
|         if self.value > other.value: |         if self.value > other.value: | ||||||
|             self.item.tkraise() |             self.canvas.tag_raise(self.item_id) | ||||||
|             other.item.tkraise() |             self.canvas.tag_raise(other.item_id) | ||||||
|         else: |         else: | ||||||
|             other.item.tkraise() |             self.canvas.tag_raise(other.item_id) | ||||||
|             self.item.tkraise() |             self.canvas.tag_raise(self.item_id) | ||||||
|         try: |         try: | ||||||
|             for i in range(len(mytrajectory)): |             for i in range(len(mytrajectory)): | ||||||
|                 mypts = mytrajectory[i] |                 mypts = mytrajectory[i] | ||||||
|                 otherpts = othertrajectory[i] |                 otherpts = othertrajectory[i] | ||||||
|                 self.item.coords((mypts[:2], mypts[2:])) |                 self.canvas.coords(self.item_id, mypts) | ||||||
|                 other.item.coords((otherpts[:2], otherpts[2:])) |                 self.canvas.coords(other.item_id, otherpts) | ||||||
|                 self.array.wait(50) |                 self.array.wait(50) | ||||||
|         finally: |         finally: | ||||||
|             mypts = mytrajectory[-1] |             mypts = mytrajectory[-1] | ||||||
|             otherpts = othertrajectory[-1] |             otherpts = othertrajectory[-1] | ||||||
|             self.item.coords((mypts[:2], mypts[2:])) |             self.canvas.coords(self.item_id, mypts) | ||||||
|             other.item.coords((otherpts[:2], otherpts[2:])) |             self.canvas.coords(other.item_id, otherpts) | ||||||
|             self.item.config(fill=myfill) |             self.canvas.itemconfig(self.item_id, fill=myfill) | ||||||
|             other.item.config(fill=otherfill) |             self.canvas.itemconfig(other.item_id, fill=otherfill) | ||||||
| 
 | 
 | ||||||
|     def compareto(self, other): |     def compareto(self, other): | ||||||
|         myfill = self.item['fill'] |         myfill = self.canvas.itemcget(self.item_id, 'fill') | ||||||
|         otherfill = other.item['fill'] |         otherfill = self.canvas.itemcget(other.item_id, 'fill') | ||||||
|         outcome = cmp(self.value, other.value) |         if self.value < other.value: | ||||||
|         if outcome < 0: |  | ||||||
|             myflash = 'white' |             myflash = 'white' | ||||||
|             otherflash = 'black' |             otherflash = 'black' | ||||||
|         elif outcome > 0: |             outcome = -1 | ||||||
|  |         elif self.value > other.value: | ||||||
|             myflash = 'black' |             myflash = 'black' | ||||||
|             otherflash = 'white' |             otherflash = 'white' | ||||||
|  |             outcome = 1 | ||||||
|         else: |         else: | ||||||
|             myflash = otherflash = 'grey' |             myflash = otherflash = 'grey' | ||||||
|  |             outcome = 0 | ||||||
|         try: |         try: | ||||||
|             self.item.config(fill=myflash) |             self.canvas.itemconfig(self.item_id, fill=myflash) | ||||||
|             other.item.config(fill=otherflash) |             self.canvas.itemconfig(other.item_id, fill=otherflash) | ||||||
|             self.array.wait(500) |             self.array.wait(500) | ||||||
|         finally: |         finally: | ||||||
|             self.item.config(fill=myfill) |             self.canvas.itemconfig(self.item_id, fill=myfill) | ||||||
|             other.item.config(fill=otherfill) |             self.canvas.itemconfig(other.item_id, fill=otherfill) | ||||||
|         return outcome |         return outcome | ||||||
| 
 | 
 | ||||||
|     def position(self): |     def position(self): | ||||||
|  | @ -429,7 +432,7 @@ def quicksort(array): | ||||||
|                         j = j-1 |                         j = j-1 | ||||||
|                 continue |                 continue | ||||||
|             array.message("Choosing pivot") |             array.message("Choosing pivot") | ||||||
|             j, i, k = first, (first+last)//2, last-1 |             j, i, k = first, (first+last) // 2, last-1 | ||||||
|             if array.compare(k, i) < 0: |             if array.compare(k, i) < 0: | ||||||
|                 array.swap(k, i) |                 array.swap(k, i) | ||||||
|             if array.compare(k, j) < 0: |             if array.compare(k, j) < 0: | ||||||
|  | @ -519,7 +522,7 @@ def set(self, value): | ||||||
| 
 | 
 | ||||||
|         self.v_size = MyIntVar(self.master, self) |         self.v_size = MyIntVar(self.master, self) | ||||||
|         self.v_size.set(size) |         self.v_size.set(size) | ||||||
|         sizes = [1, 2, 3, 4] + range(5, 55, 5) |         sizes = [1, 2, 3, 4] + list(range(5, 55, 5)) | ||||||
|         if self.size not in sizes: |         if self.size not in sizes: | ||||||
|             sizes.append(self.size) |             sizes.append(self.size) | ||||||
|             sizes.sort() |             sizes.sort() | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ | ||||||
| import os | import os | ||||||
| import re | import re | ||||||
| import sys | import sys | ||||||
| import cgi | import html | ||||||
| from xml.parsers import expat | from xml.parsers import expat | ||||||
| 
 | 
 | ||||||
| LEFT, CENTER, RIGHT = "LEFT", "CENTER", "RIGHT" | LEFT, CENTER, RIGHT = "LEFT", "CENTER", "RIGHT" | ||||||
|  | @ -201,7 +201,7 @@ def xml(self): | ||||||
|             if hasattr(cell, 'xml'): |             if hasattr(cell, 'xml'): | ||||||
|                 cellxml = cell.xml() |                 cellxml = cell.xml() | ||||||
|             else: |             else: | ||||||
|                 cellxml = '<value>%s</value>' % cgi.escape(cell) |                 cellxml = '<value>%s</value>' % html.escape(cell) | ||||||
|             out.append('<cell row="%s" col="%s">\n  %s\n</cell>' % |             out.append('<cell row="%s" col="%s">\n  %s\n</cell>' % | ||||||
|                        (y, x, cellxml)) |                        (y, x, cellxml)) | ||||||
|         out.append('</spreadsheet>') |         out.append('</spreadsheet>') | ||||||
|  | @ -216,7 +216,7 @@ def save(self, filename): | ||||||
|         f.close() |         f.close() | ||||||
| 
 | 
 | ||||||
|     def load(self, filename): |     def load(self, filename): | ||||||
|         f = open(filename, 'r') |         f = open(filename, 'rb') | ||||||
|         SheetParser(self).parsefile(f) |         SheetParser(self).parsefile(f) | ||||||
|         f.close() |         f.close() | ||||||
| 
 | 
 | ||||||
|  | @ -382,7 +382,7 @@ def xml(self): | ||||||
|         return s % ( |         return s % ( | ||||||
|             align2xml[self.alignment], |             align2xml[self.alignment], | ||||||
|             self.fmt, |             self.fmt, | ||||||
|             cgi.escape(self.text)) |             html.escape(self.text)) | ||||||
| 
 | 
 | ||||||
| class FormulaCell(BaseCell): | class FormulaCell(BaseCell): | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -7,8 +7,6 @@ | ||||||
| if TkVersion < 4.0: | if TkVersion < 4.0: | ||||||
|     raise ImportError("This version of svkill requires Tk 4.0 or later") |     raise ImportError("This version of svkill requires Tk 4.0 or later") | ||||||
| 
 | 
 | ||||||
| from string import splitfields |  | ||||||
| from string import split |  | ||||||
| import subprocess | import subprocess | ||||||
| import os | import os | ||||||
| 
 | 
 | ||||||
|  | @ -40,14 +38,14 @@ class Kill(Frame): | ||||||
|             ] |             ] | ||||||
|     def kill(self, selected): |     def kill(self, selected): | ||||||
|         c = self.format_list[self.format.get()][2] |         c = self.format_list[self.format.get()][2] | ||||||
|         pid = split(selected)[c] |         pid = selected.split()[c] | ||||||
|         os.system('kill -9 ' + pid) |         os.system('kill -9 ' + pid) | ||||||
|         self.do_update() |         self.do_update() | ||||||
|     def do_update(self): |     def do_update(self): | ||||||
|         format = self.format_list[self.format.get()][1] |         format = self.format_list[self.format.get()][1] | ||||||
|         view = self.view_list[self.view.get()][1] |         view = self.view_list[self.view.get()][1] | ||||||
|         s = subprocess.getoutput('ps %s %s' % (view, format)) |         s = subprocess.getoutput('ps %s %s' % (view, format)) | ||||||
|         list = splitfields(s, '\n') |         list = s.split('\n') | ||||||
|         self.header.set(list[0] + '          ') |         self.header.set(list[0] + '          ') | ||||||
|         del list[0] |         del list[0] | ||||||
|         self.frame.list.delete(0, AtEnd()) |         self.frame.list.delete(0, AtEnd()) | ||||||
|  | @ -97,14 +95,12 @@ def __init__(self, master=None, **cnf): | ||||||
|         self.header = StringVar(self) |         self.header = StringVar(self) | ||||||
|         self.frame.label = Label( |         self.frame.label = Label( | ||||||
|                 self.frame, relief=FLAT, anchor=NW, borderwidth=0, |                 self.frame, relief=FLAT, anchor=NW, borderwidth=0, | ||||||
|                 font='*-Courier-Bold-R-Normal-*-120-*', |  | ||||||
|                 textvariable=self.header) |                 textvariable=self.header) | ||||||
|         self.frame.label.pack(fill=Y, anchor=W) |         self.frame.label.pack(fill=Y, anchor=W) | ||||||
|         self.frame.vscroll = Scrollbar(self.frame, orient=VERTICAL) |         self.frame.vscroll = Scrollbar(self.frame, orient=VERTICAL) | ||||||
|         self.frame.list = Listbox( |         self.frame.list = Listbox( | ||||||
|                 self.frame, |                 self.frame, | ||||||
|                 relief=SUNKEN, |                 relief=SUNKEN, | ||||||
|                 font='*-Courier-Medium-R-Normal-*-120-*', |  | ||||||
|                 width=40, height=10, |                 width=40, height=10, | ||||||
|                 selectbackground='#eed5b7', |                 selectbackground='#eed5b7', | ||||||
|                 selectborderwidth=0, |                 selectborderwidth=0, | ||||||
|  |  | ||||||
|  | @ -2,15 +2,15 @@ | ||||||
| 
 | 
 | ||||||
| # Tk man page browser -- currently only shows the Tcl/Tk man pages | # Tk man page browser -- currently only shows the Tcl/Tk man pages | ||||||
| 
 | 
 | ||||||
| import sys |  | ||||||
| import os | import os | ||||||
| import string |  | ||||||
| import re | import re | ||||||
|  | import sys | ||||||
| from tkinter import * | from tkinter import * | ||||||
| from ManPage import ManPage |  | ||||||
| 
 | 
 | ||||||
| MANNDIRLIST = ['/depot/sundry/man/mann','/usr/local/man/mann'] | from manpage import ManPage | ||||||
| MAN3DIRLIST = ['/depot/sundry/man/man3','/usr/local/man/man3'] | 
 | ||||||
|  | MANNDIRLIST = ['/usr/local/man/mann', '/usr/share/man/mann'] | ||||||
|  | MAN3DIRLIST = ['/usr/local/man/man3', '/usr/share/man/man3'] | ||||||
| 
 | 
 | ||||||
| foundmanndir = 0 | foundmanndir = 0 | ||||||
| for dir in MANNDIRLIST: | for dir in MANNDIRLIST: | ||||||
|  | @ -197,7 +197,7 @@ def update(self): | ||||||
| 
 | 
 | ||||||
|     def show_page(self, name): |     def show_page(self, name): | ||||||
|         file = '%s/%s.?' % (self.chaptervar.get(), name) |         file = '%s/%s.?' % (self.chaptervar.get(), name) | ||||||
|         fp = os.popen('nroff -man %s | ul -i' % file, 'r') |         fp = os.popen('nroff -man -c %s | ul -i' % file, 'r') | ||||||
|         self.text.kill() |         self.text.kill() | ||||||
|         self.title['text'] = name |         self.title['text'] = name | ||||||
|         self.text.parsefile(fp) |         self.text.parsefile(fp) | ||||||
|  | @ -221,9 +221,9 @@ def search_string(self, search): | ||||||
|             print('Regex error:', msg) |             print('Regex error:', msg) | ||||||
|             return |             return | ||||||
|         here = self.text.index(AtInsert()) |         here = self.text.index(AtInsert()) | ||||||
|         lineno = string.atoi(here[:string.find(here, '.')]) |         lineno = int(here[:here.find('.')]) | ||||||
|         end = self.text.index(AtEnd()) |         end = self.text.index(AtEnd()) | ||||||
|         endlineno = string.atoi(end[:string.find(end, '.')]) |         endlineno = int(end[:end.find('.')]) | ||||||
|         wraplineno = lineno |         wraplineno = lineno | ||||||
|         found = 0 |         found = 0 | ||||||
|         while 1: |         while 1: | ||||||
|  | @ -237,9 +237,9 @@ def search_string(self, search): | ||||||
|             line = self.text.get('%d.0 linestart' % lineno, |             line = self.text.get('%d.0 linestart' % lineno, | ||||||
|                                  '%d.0 lineend' % lineno) |                                  '%d.0 lineend' % lineno) | ||||||
|             i = prog.search(line) |             i = prog.search(line) | ||||||
|             if i >= 0: |             if i: | ||||||
|                 found = 1 |                 found = 1 | ||||||
|                 n = max(1, len(prog.group(0))) |                 n = max(1, len(i.group(0))) | ||||||
|                 try: |                 try: | ||||||
|                     self.text.tag_remove('sel', |                     self.text.tag_remove('sel', | ||||||
|                                          AtSelFirst(), |                                          AtSelFirst(), | ||||||
|  | @ -247,10 +247,10 @@ def search_string(self, search): | ||||||
|                 except TclError: |                 except TclError: | ||||||
|                     pass |                     pass | ||||||
|                 self.text.tag_add('sel', |                 self.text.tag_add('sel', | ||||||
|                                   '%d.%d' % (lineno, i), |                                   '%d.%d' % (lineno, i.start()), | ||||||
|                                   '%d.%d' % (lineno, i+n)) |                                   '%d.%d' % (lineno, i.start()+n)) | ||||||
|                 self.text.mark_set(AtInsert(), |                 self.text.mark_set(AtInsert(), | ||||||
|                                    '%d.%d' % (lineno, i)) |                                    '%d.%d' % (lineno, i.start())) | ||||||
|                 self.text.yview_pickplace(AtInsert()) |                 self.text.yview_pickplace(AtInsert()) | ||||||
|                 break |                 break | ||||||
|         if not found: |         if not found: | ||||||
|  |  | ||||||
|  | @ -4,21 +4,25 @@ | ||||||
| import os | import os | ||||||
| import sys | import sys | ||||||
| 
 | 
 | ||||||
| tk = _tkinter.create(os.environ['DISPLAY'], 'wish', 'Tk', 1) | tk = _tkinter.create(os.environ['DISPLAY'], 'wish', 'Tk', 1, 1) | ||||||
| tk.call('update') | tk.call('update') | ||||||
| 
 | 
 | ||||||
| cmd = '' | cmd = '' | ||||||
| 
 | 
 | ||||||
| while 1: | while True: | ||||||
|     if cmd: prompt = '' |     if cmd: | ||||||
|     else: prompt = '% ' |         prompt = '' | ||||||
|  |     else: | ||||||
|  |         prompt = '% ' | ||||||
|     try: |     try: | ||||||
|         sys.stdout.write(prompt) |         sys.stdout.write(prompt) | ||||||
|         sys.stdout.flush() |         sys.stdout.flush() | ||||||
|         line = sys.stdin.readline() |         line = sys.stdin.readline() | ||||||
|  |         if not line: | ||||||
|  |             break | ||||||
|     except EOFError: |     except EOFError: | ||||||
|         break |         break | ||||||
|     cmd = cmd + (line + '\n') |     cmd += line | ||||||
|     if tk.getboolean(tk.call('info', 'complete', cmd)): |     if tk.getboolean(tk.call('info', 'complete', cmd)): | ||||||
|         tk.record(line) |         tk.record(line) | ||||||
|         try: |         try: | ||||||
|  |  | ||||||
|  | @ -1,5 +1,4 @@ | ||||||
| from tkinter import * | from tkinter import * | ||||||
| import string |  | ||||||
| 
 | 
 | ||||||
| # This program  shows how to use a simple type-in box | # This program  shows how to use a simple type-in box | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,4 @@ | ||||||
| from tkinter import * | from tkinter import * | ||||||
| import string |  | ||||||
| 
 | 
 | ||||||
| # This program  shows how to make a typein box shadow a program variable. | # This program  shows how to make a typein box shadow a program variable. | ||||||
| 
 | 
 | ||||||
|  | @ -35,7 +34,7 @@ def upper(self): | ||||||
|         # because it's being looked at by the entry widget, changing |         # because it's being looked at by the entry widget, changing | ||||||
|         # the variable changes the entry widget display automatically. |         # the variable changes the entry widget display automatically. | ||||||
|         # the strange get/set operators are clunky, true... |         # the strange get/set operators are clunky, true... | ||||||
|         str = string.upper(self.contents.get()) |         str = self.contents.get().upper() | ||||||
|         self.contents.set(str) |         self.contents.set(str) | ||||||
| 
 | 
 | ||||||
|     def print_contents(self, event): |     def print_contents(self, event): | ||||||
|  |  | ||||||
|  | @ -1,7 +1,5 @@ | ||||||
| from tkinter import * | from tkinter import * | ||||||
| 
 | 
 | ||||||
| import string |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| class Pong(Frame): | class Pong(Frame): | ||||||
|     def createWidgets(self): |     def createWidgets(self): | ||||||
|  |  | ||||||
|  | @ -35,7 +35,7 @@ def mouseEnter(self, event): | ||||||
|         # the "current" tag is applied to the object the cursor is over. |         # the "current" tag is applied to the object the cursor is over. | ||||||
|         # this happens automatically. |         # this happens automatically. | ||||||
|         self.draw.itemconfig(CURRENT, fill="red") |         self.draw.itemconfig(CURRENT, fill="red") | ||||||
|         print(self.draw.coords(CURRENT)) |         print(list(self.draw.coords(CURRENT))) | ||||||
| 
 | 
 | ||||||
|     def mouseLeave(self, event): |     def mouseLeave(self, event): | ||||||
|         # the "current" tag is applied to the object the cursor is over. |         # the "current" tag is applied to the object the cursor is over. | ||||||
|  |  | ||||||
|  | @ -529,7 +529,7 @@ catalogs, and the C library's search algorithms for locating message catalogs. | ||||||
| 
 | 
 | ||||||
| Python applications should normally find no need to invoke these functions, and | Python applications should normally find no need to invoke these functions, and | ||||||
| should use :mod:`gettext` instead.  A known exception to this rule are | should use :mod:`gettext` instead.  A known exception to this rule are | ||||||
| applications that link use additional C libraries which internally invoke | applications that link with additional C libraries which internally invoke | ||||||
| :cfunc:`gettext` or :func:`dcgettext`.  For these applications, it may be | :cfunc:`gettext` or :func:`dcgettext`.  For these applications, it may be | ||||||
| necessary to bind the text domain, so that the libraries can properly locate | necessary to bind the text domain, so that the libraries can properly locate | ||||||
| their message catalogs. | their message catalogs. | ||||||
|  |  | ||||||
|  | @ -792,9 +792,9 @@ For example: | ||||||
|     >>> a.send([1, 'hello', None]) |     >>> a.send([1, 'hello', None]) | ||||||
|     >>> b.recv() |     >>> b.recv() | ||||||
|     [1, 'hello', None] |     [1, 'hello', None] | ||||||
|     >>> b.send_bytes('thank you') |     >>> b.send_bytes(b'thank you') | ||||||
|     >>> a.recv_bytes() |     >>> a.recv_bytes() | ||||||
|     'thank you' |     b'thank you' | ||||||
|     >>> import array |     >>> import array | ||||||
|     >>> arr1 = array.array('i', range(5)) |     >>> arr1 = array.array('i', range(5)) | ||||||
|     >>> arr2 = array.array('i', [0] * 10) |     >>> arr2 = array.array('i', [0] * 10) | ||||||
|  |  | ||||||
|  | @ -229,7 +229,7 @@ The special characters are: | ||||||
|    undefined. |    undefined. | ||||||
| 
 | 
 | ||||||
| ``(?:...)`` | ``(?:...)`` | ||||||
|    A non-grouping version of regular parentheses. Matches whatever regular |    A non-capturing version of regular parentheses.  Matches whatever regular | ||||||
|    expression is inside the parentheses, but the substring matched by the group |    expression is inside the parentheses, but the substring matched by the group | ||||||
|    *cannot* be retrieved after performing a match or referenced later in the |    *cannot* be retrieved after performing a match or referenced later in the | ||||||
|    pattern. |    pattern. | ||||||
|  |  | ||||||
|  | @ -114,7 +114,7 @@ implementation as the built-in :meth:`format` method. | ||||||
| 
 | 
 | ||||||
|       Loop over the format_string and return an iterable of tuples |       Loop over the format_string and return an iterable of tuples | ||||||
|       (*literal_text*, *field_name*, *format_spec*, *conversion*).  This is used |       (*literal_text*, *field_name*, *format_spec*, *conversion*).  This is used | ||||||
|       by :meth:`vformat` to break the string in to either literal text, or |       by :meth:`vformat` to break the string into either literal text, or | ||||||
|       replacement fields. |       replacement fields. | ||||||
| 
 | 
 | ||||||
|       The values in the tuple conceptually represent a span of literal text |       The values in the tuple conceptually represent a span of literal text | ||||||
|  |  | ||||||
|  | @ -159,6 +159,20 @@ ImportWarning can also be enabled explicitly in Python code using:: | ||||||
|    warnings.simplefilter('default', ImportWarning) |    warnings.simplefilter('default', ImportWarning) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | Default Warning Filters | ||||||
|  | ~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
|  | 
 | ||||||
|  | By default, Python installs several warning filters, which can be overridden by | ||||||
|  | the command-line options passed to :option:`-W` and calls to | ||||||
|  | :func:`filterwarnings`. | ||||||
|  | 
 | ||||||
|  | * :exc:`PendingDeprecationWarning`, and :exc:`ImportWarning` are ignored. | ||||||
|  | 
 | ||||||
|  | * :exc:`BytesWarning` is ignored unless the :option:`-b` option is given once or | ||||||
|  |   twice; in this case this warning is either printed (``-b``) or turned into an | ||||||
|  |   exception (``-bb``). | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| .. _warning-suppress: | .. _warning-suppress: | ||||||
| 
 | 
 | ||||||
| Temporarily Suppressing Warnings | Temporarily Suppressing Warnings | ||||||
|  |  | ||||||
|  | @ -207,14 +207,14 @@ library/nntplib,272,:bytes,:bytes | ||||||
| library/nntplib,272,:lines,:lines | library/nntplib,272,:lines,:lines | ||||||
| library/nntplib,272,:lines,"['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']" | library/nntplib,272,:lines,"['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']" | ||||||
| library/nntplib,272,:bytes,"['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']" | library/nntplib,272,:bytes,"['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']" | ||||||
| library/pickle,567,:memory,"conn = sqlite3.connect("":memory:"")" | library/pickle,,:memory,"conn = sqlite3.connect("":memory:"")" | ||||||
| library/profile,293,:lineno,"(sort by filename:lineno)," | library/profile,,:lineno,"(sort by filename:lineno)," | ||||||
| library/socket,261,::,"(10, 1, 6, '', ('2001:888:2000:d::a2', 80, 0, 0))]" | library/socket,,::,"(10, 1, 6, '', ('2001:888:2000:d::a2', 80, 0, 0))]" | ||||||
| library/stdtypes,1026,:end,s[start:end] | library/stdtypes,1026,:end,s[start:end] | ||||||
| library/stdtypes,1195,:end,s[start:end] | library/stdtypes,1195,:end,s[start:end] | ||||||
| library/urllib.request,64,:close,Connection:close | library/urllib.request,,:close,Connection:close | ||||||
| library/urllib.request,901,:password,"""joe:password@python.org""" | library/urllib.request,,:password,"""joe:password@python.org""" | ||||||
| library/urllib.request,1064,:lang,"xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"" lang=""en"">\n\n<head>\n" | library/urllib.request,,:lang,"xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"" lang=""en"">\n\n<head>\n" | ||||||
| library/xmlrpc.client,103,:pass,http://user:pass@host:port/path | library/xmlrpc.client,103,:pass,http://user:pass@host:port/path | ||||||
| library/xmlrpc.client,103,:port,http://user:pass@host:port/path | library/xmlrpc.client,103,:port,http://user:pass@host:port/path | ||||||
| library/xmlrpc.client,103,:pass,user:pass | library/xmlrpc.client,103,:pass,user:pass | ||||||
|  |  | ||||||
| 
 | 
|  | @ -635,7 +635,7 @@ def bad_cert_test(certfile): | ||||||
|                     sys.stdout.write("\nSSLError is %s\n" % x.args[1]) |                     sys.stdout.write("\nSSLError is %s\n" % x.args[1]) | ||||||
|             except socket.error as x: |             except socket.error as x: | ||||||
|                 if support.verbose: |                 if support.verbose: | ||||||
|                     sys.stdout.write("\nsocket.error is %s\n" % x[1]) |                     sys.stdout.write("\nsocket.error is %s\n" % x.args[1]) | ||||||
|             else: |             else: | ||||||
|                 self.fail("Use of invalid cert should have failed!") |                 self.fail("Use of invalid cert should have failed!") | ||||||
|         finally: |         finally: | ||||||
|  |  | ||||||
|  | @ -23,6 +23,9 @@ transliteration too. | ||||||
| Permissions History | Permissions History | ||||||
| ------------------- | ------------------- | ||||||
| 
 | 
 | ||||||
|  | - David Malcolm was given commit access on Oct 27 2010 by GFB, | ||||||
|  |   at recommendation by Antoine Pitrou and Raymond Hettinger. | ||||||
|  | 
 | ||||||
| - Tal Einat was given commit access on Oct 4 2010 by MvL, | - Tal Einat was given commit access on Oct 4 2010 by MvL, | ||||||
|   for improving IDLE. |   for improving IDLE. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ extern "C" { | ||||||
| enum decoding_state { | enum decoding_state { | ||||||
|     STATE_INIT, |     STATE_INIT, | ||||||
|     STATE_RAW, |     STATE_RAW, | ||||||
|     STATE_NORMAL, /* have a codec associated with input */ |     STATE_NORMAL        /* have a codec associated with input */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* Tokenizer state */ | /* Tokenizer state */ | ||||||
|  |  | ||||||
|  | @ -31,7 +31,7 @@ def show(self, color, options): | ||||||
|         if dbfile != self.__databasefile: |         if dbfile != self.__databasefile: | ||||||
|             colordb = ColorDB.get_colordb(dbfile) |             colordb = ColorDB.get_colordb(dbfile) | ||||||
|         if not self.__master: |         if not self.__master: | ||||||
|             from Tkinter import Tk |             from tkinter import Tk | ||||||
|             self.__master = Tk() |             self.__master = Tk() | ||||||
|         if not self.__pw: |         if not self.__pw: | ||||||
|             self.__pw, self.__sb = \ |             self.__pw, self.__sb = \ | ||||||
|  | @ -92,7 +92,7 @@ def save(): | ||||||
|  |  | ||||||
| # test stuff | # test stuff | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
|     from Tkinter import * |     from tkinter import * | ||||||
| 
 | 
 | ||||||
|     class Tester: |     class Tester: | ||||||
|         def __init__(self): |         def __init__(self): | ||||||
|  |  | ||||||
|  | @ -6,12 +6,15 @@ | ||||||
| # | # | ||||||
| # By Bill Janssen. | # By Bill Janssen. | ||||||
| 
 | 
 | ||||||
|  | import re | ||||||
|  | import os | ||||||
|  | import ssl | ||||||
| import sys | import sys | ||||||
|  | import tempfile | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def fetch_server_certificate (host, port): | def fetch_server_certificate (host, port): | ||||||
| 
 | 
 | ||||||
|     import re, tempfile, os, ssl |  | ||||||
| 
 |  | ||||||
|     def subproc(cmd): |     def subproc(cmd): | ||||||
|         from subprocess import Popen, PIPE, STDOUT |         from subprocess import Popen, PIPE, STDOUT | ||||||
|         proc = Popen(cmd, stdout=PIPE, stderr=STDOUT, shell=True) |         proc = Popen(cmd, stdout=PIPE, stderr=STDOUT, shell=True) | ||||||
|  | @ -20,15 +23,15 @@ def subproc(cmd): | ||||||
|         return status, output |         return status, output | ||||||
| 
 | 
 | ||||||
|     def strip_to_x509_cert(certfile_contents, outfile=None): |     def strip_to_x509_cert(certfile_contents, outfile=None): | ||||||
|         m = re.search(r"^([-]+BEGIN CERTIFICATE[-]+[\r]*\n" |         m = re.search(br"^([-]+BEGIN CERTIFICATE[-]+[\r]*\n" | ||||||
|                       r".*[\r]*^[-]+END CERTIFICATE[-]+)$", |                       br".*[\r]*^[-]+END CERTIFICATE[-]+)$", | ||||||
|                       certfile_contents, re.MULTILINE | re.DOTALL) |                       certfile_contents, re.MULTILINE | re.DOTALL) | ||||||
|         if not m: |         if not m: | ||||||
|             return None |             return None | ||||||
|         else: |         else: | ||||||
|             tn = tempfile.mktemp() |             tn = tempfile.mktemp() | ||||||
|             fp = open(tn, "w") |             fp = open(tn, "wb") | ||||||
|             fp.write(m.group(1) + "\n") |             fp.write(m.group(1) + b"\n") | ||||||
|             fp.close() |             fp.close() | ||||||
|             try: |             try: | ||||||
|                 tn2 = (outfile or tempfile.mktemp()) |                 tn2 = (outfile or tempfile.mktemp()) | ||||||
|  | @ -67,6 +70,7 @@ def strip_to_x509_cert(certfile_contents, outfile=None): | ||||||
|                          (host, port)) |                          (host, port)) | ||||||
|     return certtext |     return certtext | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||||
|     if len(sys.argv) < 2: |     if len(sys.argv) < 2: | ||||||
|         sys.stderr.write( |         sys.stderr.write( | ||||||
|  | @ -75,5 +79,5 @@ def strip_to_x509_cert(certfile_contents, outfile=None): | ||||||
|         sys.exit(1) |         sys.exit(1) | ||||||
|     for arg in sys.argv[1:]: |     for arg in sys.argv[1:]: | ||||||
|         host, port = arg.split(":") |         host, port = arg.split(":") | ||||||
|         sys.stdout.write(fetch_server_certificate(host, int(port))) |         sys.stdout.buffer.write(fetch_server_certificate(host, int(port))) | ||||||
|     sys.exit(0) |     sys.exit(0) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Georg Brandl
						Georg Brandl