mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +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 @@ class Option:
|
||||||
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 @@ class BooleanOption(Option):
|
||||||
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 @@ class EnumOption(Option):
|
||||||
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 @@ class StringOption(Option):
|
||||||
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 @@ class ReadonlyOption(Option):
|
||||||
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 @@ class Dialog:
|
||||||
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 @@ class Dialog:
|
||||||
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 RemotePackDialog(PackDialog):
|
||||||
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 WidgetDialog(Dialog):
|
||||||
'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 RemoteWidgetDialog(WidgetDialog):
|
||||||
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 @@ class Object:
|
||||||
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 @@ class Object:
|
||||||
|
|
||||||
|
|
||||||
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 @@ class Electrons:
|
||||||
|
|
||||||
# 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 @@ class Tkhanoi:
|
||||||
|
|
||||||
# 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 @@ footerprog = re.compile(
|
||||||
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 @@ class EditableManPage(ScrolledText):
|
||||||
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 @@ class EditableManPage(ScrolledText):
|
||||||
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 @@ class EditableManPage(ScrolledText):
|
||||||
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 @@ class EditableManPage(ScrolledText):
|
||||||
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 @@ class ReadonlyManPage(EditableManPage):
|
||||||
# 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 @@ class MimeViewer:
|
||||||
{'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 @@ class MimeViewer:
|
||||||
'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 = Scrollbar(f, relief=FLAT)
|
||||||
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 @@ class ShellWindow(ScrolledText):
|
||||||
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 @@ class ShellWindow(ScrolledText):
|
||||||
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 @@ class ShellWindow(ScrolledText):
|
||||||
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 @@ know!
|
||||||
|
|
||||||
# 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 @@ class Card:
|
||||||
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 @@ class Card:
|
||||||
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 @@ class Deck(Stack):
|
||||||
|
|
||||||
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 @@ class OpenStack(Stack):
|
||||||
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 @@ class Solitaire:
|
||||||
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 @@ stand-alone application.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
from tkinter import *
|
from tkinter import *
|
||||||
from Canvas import Line, Rectangle
|
|
||||||
import random
|
import random
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,6 +29,9 @@ WIDTH = 6
|
||||||
|
|
||||||
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 @@ class Array:
|
||||||
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 @@ class Array:
|
||||||
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 @@ class Array:
|
||||||
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 @@ class Array:
|
||||||
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 @@ class Array:
|
||||||
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 @@ class Array:
|
||||||
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 @@ class ArrayItem:
|
||||||
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 @@ class ArrayItem:
|
||||||
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 @@ class ArrayItem:
|
||||||
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 @@ class ArrayItem:
|
||||||
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 @@ class SortDemo:
|
||||||
|
|
||||||
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 @@ class Sheet:
|
||||||
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 @@ class Sheet:
|
||||||
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 @@ class StringCell(BaseCell):
|
||||||
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 @@ from tkinter import *
|
||||||
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 @@ class Kill(Frame):
|
||||||
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 @@ class SelectionBox:
|
||||||
|
|
||||||
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 @@ class SelectionBox:
|
||||||
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 @@ class SelectionBox:
|
||||||
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 @@ class SelectionBox:
|
||||||
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 _tkinter
|
||||||
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 @@ class App(Frame):
|
||||||
# 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 @@ class Test(Frame):
|
||||||
# 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 @@ else:
|
||||||
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 @@ class Chooser:
|
||||||
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 fetch_server_certificate (host, port):
|
||||||
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 fetch_server_certificate (host, port):
|
||||||
(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 @@ if __name__ == "__main__":
|
||||||
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