Coder Social home page Coder Social logo

python-poppler-qt4's Introduction

README for Frescobaldi

Note about maintenance

Frescobaldi is unfortunately close to being unmaintained at present. Releases are extremely difficult to do due to deep packaging issues especially on macOS (issues with the macOS label) and Frescobaldi is still using PyQt5, which is now obsolete (#1407). Help to resolve these issues and continue the development of Frescobaldi is very welcome.

About Frescobaldi

Homepage: http://www.frescobaldi.org/ Main author: Wilbert Berendsen

Frescobaldi is a LilyPond sheet music text editor. It aims to be powerful, yet lightweight and easy to use. Frescobaldi is Free Software, freely available under the General Public License.

Features:

  • Powerful text editor with syntax highlighting and automatic completion
  • Music view with advanced two-way Point & Click
  • Midi player to proof-listen LilyPond-generated MIDI files
  • Midi capturing to enter music
  • Powerful Score Wizard to quickly setup a music score
  • Snippet Manager to store and apply text snippets, templates or scripts
  • Use multiple versions of LilyPond, automatically selects the correct version
  • Built-in LilyPond documentation browser and built-in help
  • Configurable document outline view to navigate large LilyPond scores easily
  • Smart layout-control functions like coloring specific objects in the PDF
  • Import ABC, Midi and MusicXML using the LilyPond-provided tools
  • Experimental export to MusicXML
  • Modern user interface with configurable colors, fonts and keyboard shortcuts
  • Translated into: Dutch, English, French, German, Italian, Swedish, Czech, Russian, Spanish, Galician, Turkish, Polish, Brazilian, Ukrainian, Traditional Chinese, Simplified Chinese and Japanese.

Music functions:

  • Transpose music
  • Change music from relative to absolute and vice versa
  • Change the language used for note names
  • Change the rhythm (double, halve, add/remove dots, copy, paste) etc
  • Hyphenate lyrics using word-processor hyphenation dictionaries
  • Add spanners, dynamics, articulation easily using the Quick Insert panel
  • Update LilyPond syntax using convert-ly, with display of differences

Frescobaldi is designed to run on all major operating systems (Linux, macOS and Windows). It is named after Girolamo Frescobaldi (1583-1643), an Italian composer of keyboard music in the late Renaissance and early Baroque period.

Here is an idea of the basic Frescobaldi workflow:

  • Start Frescobaldi
  • Open a .ly file or create one using File->New from template or Tools->Setup new Score... and fill in some music
  • Press Ctrl+M to run LilyPond
  • If the LilyPond output shows errors, press Ctrl+E to jump to the first error
  • If you see other mistakes in the music, click the notes to move the text cursor there
  • Fix the errors or mistakes in the text
  • Press Ctrl+M again to update the music view
  • When a piece is finished, press Ctrl+Shift+P once to run LilyPond with point and click turned off (this results in a much smaller PDF file).

Frescobaldi is written in Python and uses PyQt for its user interface.

Installation instructions for the program and MIDI support as well as other information can be found in the Wiki. Other requirements and installation instructions may also be found in the INSTALL.md file.

python-poppler-qt4's People

Contributors

divico avatar dliessi avatar jonathanverner avatar lorenzph avatar wbsoft avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

python-poppler-qt4's Issues

help, build failed

wb, thanks for your great work!

when I build , I failed

E:\zhichunlu_libs\python-poppler-qt4-0.18.1>setup.py build
Traceback (most recent call last):
File "E:\zhichunlu_libs\python-poppler-qt4-0.18.1\setup.py", line 56, in
import PyQt4.pyqtconfig
ImportError: No module named pyqtconfig

I found that in Pyqt 4.10 and above, pyqtconfig.py seems be removed.
http://stackoverflow.com/questions/17967542/python-importerror-pyqtconfig/18865570#18865570
http://pyqt.sourceforge.net/Docs/PyQt4/build_system.html#module-PyQt4.pyqtconfig

Versions of sip, qt,pyqt are:4.16.5 , 4.8.6 , 4.11.3

from PyQt4.Qt import *
from sip import *
print SIP_VERSION_STR, QT_VERSION_STR, PYQT_VERSION_STR
4.16.5 4.8.6 4.11.3

please ,can you do something to fix it ?

install success,but import error!

I have installed python-poppler-qt4. But when import popplerqt4, a error occured.

please help me, thank you!

My computer os: Windows7, Qt:4.8.6, poppler:0.30.0

Processing dependencies for python-poppler-qt4==0.18.2
Finished processing dependencies for python-poppler-qt4==0.18.2

E:\zhichunlu_libs\python-poppler-qt4-0.18.2>python
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.

import sys
from PyQt4 import QtGui
import popplerqt4
C:\Python27\lib\site-packages\python_poppler_qt4-0.18.2-py2.7-win32.egg\popplerq
t4.py:3: UserWarning: Module popplerqt4 was already imported from C:\Python27\li
b\site-packages\python_poppler_qt4-0.18.2-py2.7-win32.egg\popplerqt4.pyc, but e:
\zhichunlu_libs\python-poppler-qt4-0.18.2 is being added to sys.path
Traceback (most recent call last):
File "", line 1, in
File "build\bdist.win32\egg\popplerqt4.py", line 7, in
File "build\bdist.win32\egg\popplerqt4.py", line 6, in bootstrap
ImportError: DLL load failed: 找不到指定的程序。

Problem installing python-poppler-qt4 (0.24.0, Windows, Python27, Qt4.8.7, poppler-qt0.24.5)

Hi! It is necessary to build popplerqt4. Here are my steps:
Downloading the package on the computer Windovs 8.1 (Python xy, PyQt4 installed):
Compilator VC2008: C:\Program Files (x86)\Common Files\Microsoft\Visual C++ for Python\9.0
Buildind and installing SIP 4.17 (configure, nmake, nmake install).
I use link - https://bitbucket.org/lorenzph/pdfcropbox/src/6f19eb413664/doc/dependencies.rst?fileviewer=file-view-default
Building poppler-qt4 version 0.24.5
Start Visual Studio 2008 Command Promt:
set PATH="C:\Qt\4.8.7\bin;C:\Python27;C:\Program Files (x86)\CMake\bin;%PATH%"
Freetype 2.4.2-1 download from link: http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/freetype-dev_2.4.2-1_win32.zip
Creating environment variables for poppler:
set POPPLER=C:\poppler-0.24.5
set FREETYPE=C:\freetype-dev_2.4.2-1_win32

set LIB=%FREETYPE%\lib;%LIB%
set INCLUDE=%FREETYPE%\include;%INCLUDE%

cd C:\poppler-0.24.5
mkdir build
cd build

cmake -DCMAKE_INSTALL_PREFIX="%POPPLER%" -DENABLE_CPP=FALSE -DENABLE_UTILS=FALSE -DENABLE_ABIWORD=FALSE -DBUILD_QT4_TESTS=FALSE -DCMAKE_BUILD_TYPE=Release ..
nmake
nmake install
Result: poppler.lib in folder - C:\poppler-0.24.5\lib
Rename: poppler.lib -> poppler-qt4.lib
Creating environment variables for python-poppler-qt4:
set QT=C:\Qt\4.8.7
set POPPLER=C:\poppler-0.24.5
set LIB=%POPPLER%\lib;%QT%\lib
set INCLUDE=%POPPLER%;%QT%\include;%QT%\include\QtCore;%QT%\include\QtGui;%QT%\include\QtXml
Moving all files C:\poppler-0.24.5\qt4\src -> C:\poppler-0.24.5\qt4
Entered commands:
python setup.py build_ext --poppler-version=0.24.5
I get link errors - Building finished with error 1120:
...
Creating library build\temp.win32-2.7\Release\build\temp.win32-2.7\Release\popplerqt4.lib... sippopplerqt4QList0100PopplerFontInfo.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall Poppler::FontInfo::~FontInfo(void)"... sippopplerqt4PopplerTextBox.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: class Poppler::TextBox * __thiscall Poppler::TextBox::nextWord(void)const "... ... build\lib.win32-2.7\popplerqt4.pyd : fatal error LNK1120: 322 unresolved externals error: command '...\\Microsoft\\VisualC++forPython\\9.0\\VC\\Bin\\link.exe' failed with exit status 1120

Error buildind popplerqt4 in Windows

I do not know to solve this problem!
Help, please solve this problem.
And you could not fix the problem, install this package in the pip?

the fix for Python 3 breaks Python 2.6

Traceback (most recent call last):
  File "setup.py", line 118, in <module>
    pkg_config('poppler-qt4', ext_args)
  File "setup.py", line 86, in pkg_config
    if sys.version_info.major > 2:
AttributeError: 'tuple' object has no attribute 'major'

sys.version_info changed between 2.6 and 2.7, see http://docs.python.org/2.6/library/sys.html#sys.version_info (2.6) and http://docs.python.org/2/library/sys.html#sys.version_info (2.7).

You should use sys.version_info[0] instead of sys.version_info.major in setup.py lines 86 and 102.

linkDestination fails

Hi there,
i have write a little recursive function to reads in a table of content and i try to get the pageNumber for each chapter via the linkDestination function. But the link call will always return 0 and a error message: "failed to look up ..."

I use Ubuntu 14.04 with the latest python3 version (3.4.0) and with installed poppler and qt4 packages from the ubuntu repo and i have only install python-poppler-qt4 alternative via pip3

I have try this on some more eBooks with large ToC's and always i would get this messages!

The readToc funcktion looks like:

def __readToC(doc, inChapter: Chapter, node):
    n = node.firstChildElement()
    while(not n.isNull()):
        #build up this chapter
        subChapter = Chapter()

        subChapter.title = n.tagName()

        linkDest = doc.linkDestination(n.attribute("Destination"))
        subChapter.startPage = linkDest.pageNumber()-1

        #fill children
        Book.__readToC(doc, subChapter, n)

        inChapter.chapters.append(subChapter)

        n = n.nextSiblingElement()

and a print of from the toc and the link error message looks like:

<Table of Contents Destination="1;7;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
<Preface Destination="1;25;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
 <“And Now for Something Completely Different…” Destination="1;25;0;1.00076;0;0.291761;0;0;1;0" Open="false"/>
 <About This Book Destination="1;26;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <This Book’s Ecosystem Destination="1;26;0;1.00076;0;0.21164;0;0;1;0" Open="false"/>
  <What This Book Is Not Destination="1;27;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
 </About This Book>
 <About This Fourth Edition Destination="1;27;0;1.00076;0;0.588057;0;0;1;0" Open="false">
  <Specific Changes in This Edition Destination="1;28;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
 </About This Fourth Edition>
 <What’s Left, Then? Destination="1;32;0;1.00076;0;0.544218;0;0;1;0" Open="false"/>
 <Python 3.X Impacts on This Book Destination="1;33;0;1.00076;0;0.485261;0;0;1;0" Open="false">
  <Specific 3.X Changes Destination="1;34;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  <Language Versus Library: Unicode Destination="1;35;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  <Python 3.1 Limitations: Email, CGI Destination="1;35;0;1.00076;0;0.643991;0;0;1;0" Open="false"/>
 </Python 3.X Impacts on This Book>
 <Using Book Examples Destination="1;36;0;1.00076;0;0.604686;0;0;1;0" Open="false">
  <Where to Look for Examples and Updates Destination="1;36;0;1.00076;0;0.702948;0;0;1;0" Open="false"/>
  <Example Portability Destination="1;37;0;1.00076;0;0.489796;0;0;1;0" Open="false"/>
  <Demo Launchers Destination="1;38;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  <Code Reuse Policies Destination="1;38;0;1.00076;0;0.243386;0;0;1;0" Open="false"/>
 </Using Book Examples>
 <Contacting O’Reilly Destination="1;38;0;1.00076;0;0.527589;0;0;1;0" Open="false"/>
 <Conventions Used in This Book Destination="1;39;0;1.00076;0;0.145125;0;0;1;0" Open="false"/>
 <Acknowledgments Destination="1;39;0;1.00076;0;0.594104;0;0;1;0" Open="false"/>
</Preface>
<Part I. The Beginning Destination="1;43;0;1.00076;0;0.0786092;0;0;1;0" Open="false">
 <Chapter 1. A Sneak Preview Destination="1;45;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Programming Python: The Short Story” Destination="1;45;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
  <The Task Destination="1;46;0;1.00076;0;0.272109;0;0;1;0" Open="false"/>
  <Step 1: Representing Records Destination="1;46;0;1.00076;0;0.56387;0;0;1;0" Open="false">
   <Using Lists Destination="1;46;0;1.00076;0;0.699924;0;0;1;0" Open="false">
    <Start-up pointers Destination="1;47;0;1.00076;0;0.402116;0;0;1;0" Open="false"/>
    <A database list Destination="1;48;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Field labels Destination="1;49;0;1.00076;0;0.173847;0;0;1;0" Open="false"/>
   </Using Lists>
   <Using Dictionaries Destination="1;51;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Other ways to make dictionaries Destination="1;51;0;1.00076;0;0.509448;0;0;1;0" Open="false"/>
    <Lists of dictionaries Destination="1;52;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
    <Nested structures Destination="1;53;0;1.00076;0;0.547241;0;0;1;0" Open="false"/>
    <Dictionaries of dictionaries Destination="1;54;0;1.00076;0;0.513983;0;0;1;0" Open="false"/>
   </Using Dictionaries>
  </Step 1: Representing Records>
  <Step 2: Storing Records Persistently Destination="1;56;0;1.00076;0;0.450491;0;0;1;0" Open="false">
   <Using Formatted Files Destination="1;56;0;1.00076;0;0.604686;0;0;1;0" Open="false">
    <Test data script Destination="1;56;0;1.00076;0;0.715042;0;0;1;0" Open="false"/>
    <File name conventions Destination="1;57;0;1.00076;0;0.61678;0;0;1;0" Open="false"/>
    <Script start-up pointers Destination="1;58;0;1.00076;0;0.256992;0;0;1;0" Open="false"/>
    <Data format script Destination="1;58;0;1.00076;0;0.70446;0;0;1;0" Open="false"/>
    <Utility scripts Destination="1;60;0;1.00076;0;0.657596;0;0;1;0" Open="false"/>
   </Using Formatted Files>
   <Using Pickle Files Destination="1;61;0;1.00076;0;0.637944;0;0;1;0" Open="false"/>
   <Using Per-Record Pickle Files Destination="1;64;0;1.00076;0;0.137566;0;0;1;0" Open="false"/>
   <Using Shelves Destination="1;65;0;1.00076;0;0.491308;0;0;1;0" Open="false"/>
  </Step 2: Storing Records Persistently>
  <Step 3: Stepping Up to OOP Destination="1;68;0;1.00076;0;0.338624;0;0;1;0" Open="false">
   <Using Classes Destination="1;69;0;1.00076;0;0.70446;0;0;1;0" Open="false"/>
   <Adding Behavior Destination="1;71;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
   <Adding Inheritance Destination="1;71;0;1.00076;0;0.781557;0;0;1;0" Open="false"/>
   <Refactoring Code Destination="1;73;0;1.00076;0;0.21164;0;0;1;0" Open="false">
    <Augmenting methods Destination="1;73;0;1.00076;0;0.303855;0;0;1;0" Open="false"/>
    <Display format Destination="1;73;0;1.00076;0;0.777022;0;0;1;0" Open="false"/>
    <Constructor customization Destination="1;74;0;1.00076;0;0.39607;0;0;1;0" Open="false"/>
    <Alternative classes Destination="1;74;0;1.00076;0;0.718065;0;0;1;0" Open="false"/>
   </Refactoring Code>
   <Adding Persistence Destination="1;76;0;1.00076;0;0.229781;0;0;1;0" Open="false"/>
   <Other Database Options Destination="1;78;0;1.00076;0;0.173847;0;0;1;0" Open="false"/>
  </Step 3: Stepping Up to OOP>
  <Step 4: Adding Console Interaction Destination="1;79;0;1.00076;0;0.320484;0;0;1;0" Open="false">
   <A Console Shelve Interface Destination="1;79;0;1.00076;0;0.494331;0;0;1;0" Open="false"/>
  </Step 4: Adding Console Interaction>
  <Step 5: Adding a GUI Destination="1;82;0;1.00076;0;0.154195;0;0;1;0" Open="false">
   <GUI Basics Destination="1;82;0;1.00076;0;0.290249;0;0;1;0" Open="false"/>
   <Using OOP for GUIs Destination="1;84;0;1.00076;0;0.373394;0;0;1;0" Open="false"/>
   <Getting Input from a User Destination="1;86;0;1.00076;0;0.671202;0;0;1;0" Open="false"/>
   <A GUI Shelve Interface Destination="1;88;0;1.00076;0;0.119426;0;0;1;0" Open="false">
    <Coding the GUI Destination="1;88;0;1.00076;0;0.574452;0;0;1;0" Open="false"/>
    <Using the GUI Destination="1;90;0;1.00076;0;0.191988;0;0;1;0" Open="false"/>
    <Future directions Destination="1;91;0;1.00076;0;0.628874;0;0;1;0" Open="false"/>
   </A GUI Shelve Interface>
  </Step 5: Adding a GUI>
  <Step 6: Adding a Web Interface Destination="1;94;0;1.00076;0;0.1678;0;0;1;0" Open="false">
   <CGI Basics Destination="1;94;0;1.00076;0;0.715042;0;0;1;0" Open="false">
    <GUIs versus the Web Destination="1;97;0;1.00076;0;0.173847;0;0;1;0" Open="false"/>
   </CGI Basics>
   <Running a Web Server Destination="1;97;0;1.00076;0;0.622827;0;0;1;0" Open="false"/>
   <Using Query Strings and urllib Destination="1;99;0;1.00076;0;0.780045;0;0;1;0" Open="false"/>
   <Formatting Reply Text Destination="1;101;0;1.00076;0;0.331066;0;0;1;0" Open="false"/>
   <A Web-Based Shelve Interface Destination="1;102;0;1.00076;0;0.155707;0;0;1;0" Open="false">
    <Coding the website Destination="1;102;0;1.00076;0;0.592593;0;0;1;0" Open="false"/>
    <Directories, string formatting, and security Destination="1;105;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Using the website Destination="1;106;0;1.00076;0;0.604686;0;0;1;0" Open="false"/>
    <Future directions Destination="1;110;0;1.00076;0;0.737717;0;0;1;0" Open="false"/>
   </A Web-Based Shelve Interface>
  </Step 6: Adding a Web Interface>
  <The End of the Demo Destination="1;111;0;1.00076;0;0.654573;0;0;1;0" Open="false"/>
 </Chapter 1. A Sneak Preview>
</Part I. The Beginning>
<Part II. System Programming Destination="1;113;0;1.00076;0;0.0786092;0;0;1;0" Open="false">
 <Chapter 2. System Tools Destination="1;115;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“The os.path to Knowledge” Destination="1;115;0;1.00076;0;0.320484;0;0;1;0" Open="false">
   <Why Python Here? Destination="1;115;0;1.00076;0;0.569917;0;0;1;0" Open="false"/>
   <The Next Five Chapters Destination="1;116;0;1.00076;0;0.273621;0;0;1;0" Open="false"/>
  </“The os.path to Knowledge”>
  <System Scripting Overview Destination="1;117;0;1.00076;0;0.637944;0;0;1;0" Open="false">
   <Python System Modules Destination="1;118;0;1.00076;0;0.473167;0;0;1;0" Open="false"/>
   <Module Documentation Sources Destination="1;119;0;1.00076;0;0.393046;0;0;1;0" Open="false"/>
   <Paging Documentation Strings Destination="1;120;0;1.00076;0;0.321995;0;0;1;0" Open="false"/>
   <A Custom Paging Script Destination="1;121;0;1.00076;0;0.3613;0;0;1;0" Open="false"/>
   <String Method Basics Destination="1;122;0;1.00076;0;0.393046;0;0;1;0" Open="false"/>
   <Other String Concepts in Python 3.X: Unicode and bytes Destination="1;124;0;1.00076;0;0.692366;0;0;1;0" Open="false"/>
   <File Operation Basics Destination="1;125;0;1.00076;0;0.585034;0;0;1;0" Open="false"/>
   <Using Programs in Two Ways Destination="1;126;0;1.00076;0;0.293273;0;0;1;0" Open="false"/>
   <Python Library Manuals Destination="1;127;0;1.00076;0;0.60771;0;0;1;0" Open="false"/>
   <Commercially Published References Destination="1;128;0;1.00076;0;0.220711;0;0;1;0" Open="false"/>
  </System Scripting Overview>
  <Introducing the sys Module Destination="1;128;0;1.00076;0;0.403628;0;0;1;0" Open="false">
   <Platforms and Versions Destination="1;128;0;1.00076;0;0.595616;0;0;1;0" Open="false"/>
   <The Module Search Path Destination="1;129;0;1.00076;0;0.288738;0;0;1;0" Open="false"/>
   <The Loaded Modules Table Destination="1;130;0;1.00076;0;0.609221;0;0;1;0" Open="false"/>
   <Exception Details Destination="1;131;0;1.00076;0;0.219199;0;0;1;0" Open="false"/>
   <Other sys Module Exports Destination="1;132;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  </Introducing the sys Module>
  <Introducing the os Module Destination="1;132;0;1.00076;0;0.250945;0;0;1;0" Open="false">
   <Tools in the os Module Destination="1;132;0;1.00076;0;0.480726;0;0;1;0" Open="false"/>
   <Administrative Tools Destination="1;133;0;1.00076;0;0.485261;0;0;1;0" Open="false"/>
   <Portability Constants Destination="1;134;0;1.00076;0;0.21164;0;0;1;0" Open="false"/>
   <Common os.path Tools Destination="1;134;0;1.00076;0;0.677249;0;0;1;0" Open="false"/>
   <Running Shell Commands from Scripts Destination="1;136;0;1.00076;0;0.761905;0;0;1;0" Open="false">
    <What’s a shell command? Destination="1;137;0;1.00076;0;0.288738;0;0;1;0" Open="false"/>
    <Running shell commands Destination="1;137;0;1.00076;0;0.736206;0;0;1;0" Open="false"/>
    <Communicating with shell commands Destination="1;138;0;1.00076;0;0.474679;0;0;1;0" Open="false"/>
    <The subprocess module alternative Destination="1;139;0;1.00076;0;0.488284;0;0;1;0" Open="false"/>
    <Shell command limitations Destination="1;141;0;1.00076;0;0.173847;0;0;1;0" Open="false"/>
   </Running Shell Commands from Scripts>
   <Other os Module Exports Destination="1;142;0;1.00076;0;0.445956;0;0;1;0" Open="false"/>
  </Introducing the os Module>
 </Chapter 2. System Tools>
 <Chapter 3. Script Execution Context Destination="1;145;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“I’d Like to Have an Argument, Please” Destination="1;145;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
  <Current Working Directory Destination="1;146;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <CWD, Files, and Import Paths Destination="1;146;0;1.00076;0;0.331066;0;0;1;0" Open="false"/>
   <CWD and Command Lines Destination="1;148;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  </Current Working Directory>
  <Command-Line Arguments Destination="1;148;0;1.00076;0;0.622827;0;0;1;0" Open="false">
   <Parsing Command-Line Arguments Destination="1;149;0;1.00076;0;0.636432;0;0;1;0" Open="false"/>
  </Command-Line Arguments>
  <Shell Environment Variables Destination="1;151;0;1.00076;0;0.710506;0;0;1;0" Open="false">
   <Fetching Shell Variables Destination="1;152;0;1.00076;0;0.191988;0;0;1;0" Open="false"/>
   <Changing Shell Variables Destination="1;153;0;1.00076;0;0.137566;0;0;1;0" Open="false"/>
   <Shell Variable Fine Points: Parents, putenv, and getenv Destination="1;154;0;1.00076;0;0.643991;0;0;1;0" Open="false"/>
  </Shell Environment Variables>
  <Standard Streams Destination="1;155;0;1.00076;0;0.429327;0;0;1;0" Open="false">
   <Redirecting Streams to Files and Programs Destination="1;156;0;1.00076;0;0.50189;0;0;1;0" Open="false">
    <Chaining programs with pipes Destination="1;158;0;1.00076;0;0.362812;0;0;1;0" Open="false"/>
    <Coding alternatives for adders and sorters Destination="1;160;0;1.00076;0;0.432351;0;0;1;0" Open="false"/>
   </Redirecting Streams to Files and Programs>
   <Redirected Streams and User Interaction Destination="1;161;0;1.00076;0;0.46712;0;0;1;0" Open="false"/>
   <Redirecting Streams to Python Objects Destination="1;165;0;1.00076;0;0.219199;0;0;1;0" Open="false"/>
   <The io.StringIO and io.BytesIO Utility Classes Destination="1;168;0;1.00076;0;0.285714;0;0;1;0" Open="false"/>
   <Capturing the stderr Stream Destination="1;169;0;1.00076;0;0.373394;0;0;1;0" Open="false"/>
   <Redirection Syntax in Print Calls Destination="1;169;0;1.00076;0;0.721088;0;0;1;0" Open="false"/>
   <Other Redirection Options: os.popen and subprocess Revisited Destination="1;170;0;1.00076;0;0.500378;0;0;1;0" Open="false">
    <Redirecting input or output with os.popen Destination="1;171;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Redirecting input and output with subprocess Destination="1;172;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </Other Redirection Options: os.popen and subprocess Revisited>
  </Standard Streams>
 </Chapter 3. Script Execution Context>
 <Chapter 4. File and Directory Tools Destination="1;177;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Erase Your Hard Drive in Five Easy Steps!” Destination="1;177;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
  <File Tools Destination="1;177;0;1.00076;0;0.524565;0;0;1;0" Open="false">
   <The File Object Model in Python 3.X Destination="1;178;0;1.00076;0;0.273621;0;0;1;0" Open="false"/>
   <Using Built-in File Objects Destination="1;179;0;1.00076;0;0.585034;0;0;1;0" Open="false">
    <Output files Destination="1;179;0;1.00076;0;0.787604;0;0;1;0" Open="false">
     <Opening Destination="1;180;0;1.00076;0;0.459562;0;0;1;0" Open="false"/>
     <Writing Destination="1;180;0;1.00076;0;0.677249;0;0;1;0" Open="false"/>
    </Output files>
    <Ensuring file closure: Exception handlers and context managers Destination="1;181;0;1.00076;0;0.761905;0;0;1;0" Open="false">
     <Closing Destination="1;181;0;1.00076;0;0.126984;0;0;1;0" Open="false"/>
    </Ensuring file closure: Exception handlers and context managers>
    <Input files Destination="1;183;0;1.00076;0;0.344671;0;0;1;0" Open="false"/>
    <Reading lines with file iterators Destination="1;185;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Other open options Destination="1;186;0;1.00076;0;0.577475;0;0;1;0" Open="false"/>
   </Using Built-in File Objects>
   <Binary and Text Files Destination="1;188;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Unicode encodings for text files Destination="1;189;0;1.00076;0;0.260015;0;0;1;0" Open="false"/>
    <End-of-line translations for text files Destination="1;191;0;1.00076;0;0.367347;0;0;1;0" Open="false"/>
    <Parsing packed binary data with the struct module Destination="1;193;0;1.00076;0;0.677249;0;0;1;0" Open="false"/>
    <Random access files Destination="1;195;0;1.00076;0;0.237339;0;0;1;0" Open="false"/>
   </Binary and Text Files>
   <Lower-Level File Tools in the os Module Destination="1;197;0;1.00076;0;0.622827;0;0;1;0" Open="false">
    <Using os.open files Destination="1;198;0;1.00076;0;0.294785;0;0;1;0" Open="false"/>
    <os.open mode flags Destination="1;199;0;1.00076;0;0.270597;0;0;1;0" Open="false"/>
    <Wrapping descriptors in file objects Destination="1;200;0;1.00076;0;0.293273;0;0;1;0" Open="false"/>
    <Other os module file tools Destination="1;201;0;1.00076;0;0.263039;0;0;1;0" Open="false"/>
   </Lower-Level File Tools in the os Module>
   <File Scanners Destination="1;202;0;1.00076;0;0.521542;0;0;1;0" Open="false">
    <File filters Destination="1;204;0;1.00076;0;0.468632;0;0;1;0" Open="false"/>
   </File Scanners>
  </File Tools>
  <Directory Tools Destination="1;205;0;1.00076;0;0.645503;0;0;1;0" Open="false">
   <Walking One Directory Destination="1;206;0;1.00076;0;0.173847;0;0;1;0" Open="false">
    <Running shell listing commands with os.popen Destination="1;206;0;1.00076;0;0.358277;0;0;1;0" Open="false"/>
    <The glob module Destination="1;208;0;1.00076;0;0.152683;0;0;1;0" Open="false"/>
    <The os.listdir call Destination="1;209;0;1.00076;0;0.226757;0;0;1;0" Open="false"/>
    <Splitting and joining listing results Destination="1;210;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </Walking One Directory>
   <Walking Directory Trees Destination="1;210;0;1.00076;0;0.637944;0;0;1;0" Open="false">
    <The os.walk visitor Destination="1;211;0;1.00076;0;0.173847;0;0;1;0" Open="false"/>
    <Recursive os.listdir traversals Destination="1;213;0;1.00076;0;0.66969;0;0;1;0" Open="false"/>
   </Walking Directory Trees>
   <Handling Unicode Filenames in 3.X: listdir, walk, glob Destination="1;214;0;1.00076;0;0.761905;0;0;1;0" Open="false">
    <Unicode policies: File content versus file names Destination="1;216;0;1.00076;0;0.318972;0;0;1;0" Open="false"/>
   </Handling Unicode Filenames in 3.X: listdir, walk, glob>
  </Directory Tools>
 </Chapter 4. File and Directory Tools>
 <Chapter 5. Parallel System Tools Destination="1;219;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Telling the Monkeys What to Do” Destination="1;219;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
  <Forking Processes Destination="1;221;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <The fork/exec Combination Destination="1;224;0;1.00076;0;0.282691;0;0;1;0" Open="false">
    <os.exec call formats Destination="1;225;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Spawned child program Destination="1;226;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </The fork/exec Combination>
  </Forking Processes>
  <Threads Destination="1;228;0;1.00076;0;0.377929;0;0;1;0" Open="false">
   <The _thread Module Destination="1;231;0;1.00076;0;0.474679;0;0;1;0" Open="false">
    <Basic usage Destination="1;231;0;1.00076;0;0.636432;0;0;1;0" Open="false"/>
    <Other ways to code threads with _thread Destination="1;233;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
    <Running multiple threads Destination="1;233;0;1.00076;0;0.693878;0;0;1;0" Open="false"/>
    <Synchronizing access to shared objects and names Destination="1;235;0;1.00076;0;0.61678;0;0;1;0" Open="false"/>
    <Waiting for spawned thread exits Destination="1;237;0;1.00076;0;0.656085;0;0;1;0" Open="false"/>
    <Coding alternatives: busy loops, arguments, and context managers Destination="1;239;0;1.00076;0;0.692366;0;0;1;0" Open="false"/>
   </The _thread Module>
   <The threading Module Destination="1;241;0;1.00076;0;0.471655;0;0;1;0" Open="false">
    <Other ways to code threads with threading Destination="1;243;0;1.00076;0;0.329554;0;0;1;0" Open="false"/>
    <Synchronizing access to shared objects and names revisited Destination="1;244;0;1.00076;0;0.532124;0;0;1;0" Open="false"/>
   </The threading Module>
   <The queue Module Destination="1;246;0;1.00076;0;0.701436;0;0;1;0" Open="false">
    <Arguments versus globals Destination="1;248;0;1.00076;0;0.157218;0;0;1;0" Open="false"/>
    <Program exit with child threads Destination="1;248;0;1.00076;0;0.524565;0;0;1;0" Open="false"/>
    <Running the script Destination="1;249;0;1.00076;0;0.536659;0;0;1;0" Open="false"/>
   </The queue Module>
   <Preview: GUIs and Threads Destination="1;250;0;1.00076;0;0.631897;0;0;1;0" Open="false"/>
   <More on the Global Interpreter Lock Destination="1;253;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <The thread switch interval Destination="1;254;0;1.00076;0;0.25548;0;0;1;0" Open="false"/>
    <Atomic operations Destination="1;254;0;1.00076;0;0.474679;0;0;1;0" Open="false"/>
    <C API thread considerations Destination="1;254;0;1.00076;0;0.805745;0;0;1;0" Open="false"/>
    <A process-based alternative: multiprocessing (ahead) Destination="1;255;0;1.00076;0;0.411187;0;0;1;0" Open="false"/>
   </More on the Global Interpreter Lock>
  </Threads>
  <Program Exits Destination="1;255;0;1.00076;0;0.742252;0;0;1;0" Open="false">
   <sys Module Exits Destination="1;256;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
   <os Module Exits Destination="1;257;0;1.00076;0;0.270597;0;0;1;0" Open="false"/>
   <Shell Command Exit Status Codes Destination="1;258;0;1.00076;0;0.182918;0;0;1;0" Open="false">
    <Exit status with os.system and os.popen Destination="1;258;0;1.00076;0;0.737717;0;0;1;0" Open="false"/>
    <Output stream buffering: A first look Destination="1;260;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Exit status with subprocess Destination="1;260;0;1.00076;0;0.698413;0;0;1;0" Open="false"/>
   </Shell Command Exit Status Codes>
   <Process Exit Status and Shared State Destination="1;261;0;1.00076;0;0.524565;0;0;1;0" Open="false"/>
   <Thread Exits and Shared State Destination="1;262;0;1.00076;0;0.640967;0;0;1;0" Open="false"/>
  </Program Exits>
  <Interprocess Communication Destination="1;264;0;1.00076;0;0.613757;0;0;1;0" Open="false">
   <Anonymous Pipes Destination="1;266;0;1.00076;0;0.199546;0;0;1;0" Open="false">
    <Anonymous pipe basics Destination="1;266;0;1.00076;0;0.666667;0;0;1;0" Open="false"/>
    <Wrapping pipe descriptors in file objects Destination="1;268;0;1.00076;0;0.285714;0;0;1;0" Open="false"/>
    <Anonymous pipes and threads Destination="1;269;0;1.00076;0;0.690854;0;0;1;0" Open="false"/>
    <Bidirectional IPC with anonymous pipes Destination="1;270;0;1.00076;0;0.656085;0;0;1;0" Open="false"/>
    <Output stream buffering revisited: Deadlocks and flushes Destination="1;273;0;1.00076;0;0.559335;0;0;1;0" Open="false"/>
   </Anonymous Pipes>
   <Named Pipes (Fifos) Destination="1;276;0;1.00076;0;0.226757;0;0;1;0" Open="false">
    <Named pipe basics Destination="1;277;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Named pipe use cases Destination="1;278;0;1.00076;0;0.415722;0;0;1;0" Open="false"/>
   </Named Pipes (Fifos)>
   <Sockets: A First Look Destination="1;278;0;1.00076;0;0.698413;0;0;1;0" Open="false">
    <Socket basics Destination="1;279;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Sockets and independent programs Destination="1;280;0;1.00076;0;0.592593;0;0;1;0" Open="false"/>
    <Socket use cases Destination="1;281;0;1.00076;0;0.760393;0;0;1;0" Open="false"/>
   </Sockets: A First Look>
   <Signals Destination="1;282;0;1.00076;0;0.592593;0;0;1;0" Open="false"/>
  </Interprocess Communication>
  <The multiprocessing Module Destination="1;285;0;1.00076;0;0.504913;0;0;1;0" Open="false">
   <Why multiprocessing? Destination="1;285;0;1.00076;0;0.796674;0;0;1;0" Open="false"/>
   <The Basics: Processes and Locks Destination="1;287;0;1.00076;0;0.518519;0;0;1;0" Open="false">
    <Implementation and usage rules Destination="1;288;0;1.00076;0;0.758881;0;0;1;0" Open="false"/>
   </The Basics: Processes and Locks>
   <IPC Tools: Pipes, Shared Memory, and Queues Destination="1;290;0;1.00076;0;0.119426;0;0;1;0" Open="false">
    <multiprocessing pipes Destination="1;291;0;1.00076;0;0.219199;0;0;1;0" Open="false"/>
    <Shared memory and globals Destination="1;292;0;1.00076;0;0.287226;0;0;1;0" Open="false"/>
    <Queues and subclassing Destination="1;294;0;1.00076;0;0.619803;0;0;1;0" Open="false"/>
   </IPC Tools: Pipes, Shared Memory, and Queues>
   <Starting Independent Programs Destination="1;296;0;1.00076;0;0.595616;0;0;1;0" Open="false"/>
   <And Much More Destination="1;298;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <And a little less… Destination="1;298;0;1.00076;0;0.60771;0;0;1;0" Open="false"/>
   </And Much More>
   <Why multiprocessing? The Conclusion Destination="1;299;0;1.00076;0;0.504913;0;0;1;0" Open="false"/>
  </The multiprocessing Module>
  <Other Ways to Start Programs Destination="1;300;0;1.00076;0;0.155707;0;0;1;0" Open="false">
   <The os.spawn Calls Destination="1;300;0;1.00076;0;0.328042;0;0;1;0" Open="false"/>
   <The os.startfile call on Windows Destination="1;303;0;1.00076;0;0.479214;0;0;1;0" Open="false">
    <Using the DOS start command Destination="1;303;0;1.00076;0;0.645503;0;0;1;0" Open="false"/>
    <Using start in Python scripts Destination="1;304;0;1.00076;0;0.473167;0;0;1;0" Open="false"/>
    <The os.startfile call Destination="1;305;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </The os.startfile call on Windows>
  </Other Ways to Start Programs>
  <A Portable Program-Launch Framework Destination="1;305;0;1.00076;0;0.542706;0;0;1;0" Open="false"/>
  <Other System Tools Coverage Destination="1;310;0;1.00076;0;0.318972;0;0;1;0" Open="false"/>
 </Chapter 5. Parallel System Tools>
 <Chapter 6. Complete System Programs Destination="1;313;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“The Greps of Wrath” Destination="1;313;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
  <A Quick Game of “Find the Biggest Python File” Destination="1;314;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <Scanning the Standard Library Directory Destination="1;314;0;1.00076;0;0.249433;0;0;1;0" Open="false"/>
   <Scanning the Standard Library Tree Destination="1;315;0;1.00076;0;0.154195;0;0;1;0" Open="false"/>
   <Scanning the Module Search Path Destination="1;316;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Scanning the Entire Machine Destination="1;318;0;1.00076;0;0.137566;0;0;1;0" Open="false"/>
   <Printing Unicode Filenames Destination="1;321;0;1.00076;0;0.764928;0;0;1;0" Open="false"/>
  </A Quick Game of “Find the Biggest Python File”>
  <Splitting and Joining Files Destination="1;324;0;1.00076;0;0.347695;0;0;1;0" Open="false">
   <Splitting Files Portably Destination="1;325;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
   <Joining Files Portably Destination="1;328;0;1.00076;0;0.479214;0;0;1;0" Open="false"/>
   <Usage Variations Destination="1;331;0;1.00076;0;0.270597;0;0;1;0" Open="false"/>
  </Splitting and Joining Files>
  <Generating Redirection Web Pages Destination="1;334;0;1.00076;0;0.681784;0;0;1;0" Open="false">
   <Page Template File Destination="1;335;0;1.00076;0;0.51096;0;0;1;0" Open="false"/>
   <Page Generator Script Destination="1;336;0;1.00076;0;0.350718;0;0;1;0" Open="false"/>
  </Generating Redirection Web Pages>
  <A Regression Test Script Destination="1;339;0;1.00076;0;0.155707;0;0;1;0" Open="false">
   <Running the Test Driver Destination="1;341;0;1.00076;0;0.56387;0;0;1;0" Open="false"/>
  </A Regression Test Script>
  <Copying Directory Trees Destination="1;346;0;1.00076;0;0.630385;0;0;1;0" Open="false"/>
  <Comparing Directory Trees Destination="1;350;0;1.00076;0;0.479214;0;0;1;0" Open="false">
   <Finding Directory Differences Destination="1;351;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
   <Finding Tree Differences Destination="1;353;0;1.00076;0;0.373394;0;0;1;0" Open="false"/>
   <Running the Script Destination="1;356;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Verifying Backups Destination="1;358;0;1.00076;0;0.1935;0;0;1;0" Open="false"/>
   <Reporting Differences and Other Ideas Destination="1;359;0;1.00076;0;0.746788;0;0;1;0" Open="false"/>
  </Comparing Directory Trees>
  <Searching Directory Trees Destination="1;361;0;1.00076;0;0.610733;0;0;1;0" Open="false">
   <Greps and Globs and Finds Destination="1;362;0;1.00076;0;0.155707;0;0;1;0" Open="false"/>
   <Rolling Your Own find Module Destination="1;363;0;1.00076;0;0.187453;0;0;1;0" Open="false">
    <The fnmatch module Destination="1;365;0;1.00076;0;0.485261;0;0;1;0" Open="false"/>
   </Rolling Your Own find Module>
   <Cleaning Up Bytecode Files Destination="1;366;0;1.00076;0;0.770975;0;0;1;0" Open="false"/>
   <A Python Tree Searcher Destination="1;369;0;1.00076;0;0.506425;0;0;1;0" Open="false"/>
  </Searching Directory Trees>
  <Visitor: Walking Directories “++” Destination="1;372;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <Editing Files in Directory Trees (Visitor) Destination="1;376;0;1.00076;0;0.677249;0;0;1;0" Open="false"/>
   <Global Replacements in Directory Trees (Visitor) Destination="1;378;0;1.00076;0;0.241875;0;0;1;0" Open="false"/>
   <Counting Source Code Lines (Visitor) Destination="1;380;0;1.00076;0;0.191988;0;0;1;0" Open="false"/>
   <Recoding Copies with Classes (Visitor) Destination="1;381;0;1.00076;0;0.742252;0;0;1;0" Open="false"/>
   <Other Visitor Examples (External) Destination="1;383;0;1.00076;0;0.588057;0;0;1;0" Open="false"/>
  </Visitor: Walking Directories “++”>
  <Playing Media Files Destination="1;385;0;1.00076;0;0.329554;0;0;1;0" Open="false">
   <The Python webbrowser Module Destination="1;389;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
   <The Python mimetypes Module Destination="1;390;0;1.00076;0;0.347695;0;0;1;0" Open="false">
    <Using mimetypes guesses for SearchVisitor Destination="1;391;0;1.00076;0;0.707483;0;0;1;0" Open="false"/>
   </The Python mimetypes Module>
   <Running the Script Destination="1;392;0;1.00076;0;0.719577;0;0;1;0" Open="false"/>
  </Playing Media Files>
  <Automated Program Launchers (External) Destination="1;393;0;1.00076;0;0.367347;0;0;1;0" Open="false"/>
 </Chapter 6. Complete System Programs>
</Part II. System Programming>
<Part III. GUI Programming Destination="1;395;0;1.00076;0;0.0786092;0;0;1;0" Open="false">
 <Chapter 7. Graphical User Interfaces Destination="1;397;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Here’s Looking at You, Kid” Destination="1;397;0;1.00076;0;0.320484;0;0;1;0" Open="false">
   <GUI Programming Topics Destination="1;397;0;1.00076;0;0.62585;0;0;1;0" Open="false"/>
   <Running the Examples Destination="1;399;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  </“Here’s Looking at You, Kid”>
  <Python GUI Development Options Destination="1;400;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  <tkinter Overview Destination="1;405;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <tkinter Pragmatics Destination="1;405;0;1.00076;0;0.229781;0;0;1;0" Open="false"/>
   <tkinter Documentation Destination="1;406;0;1.00076;0;0.137566;0;0;1;0" Open="false"/>
   <tkinter Extensions Destination="1;406;0;1.00076;0;0.659108;0;0;1;0" Open="false"/>
   <tkinter Structure Destination="1;408;0;1.00076;0;0.622827;0;0;1;0" Open="false">
    <Implementation structure Destination="1;408;0;1.00076;0;0.751323;0;0;1;0" Open="false"/>
    <Programming structure Destination="1;409;0;1.00076;0;0.374906;0;0;1;0" Open="false"/>
   </tkinter Structure>
  </tkinter Overview>
  <Climbing the GUI Learning Curve Destination="1;410;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <“Hello World” in Four Lines (or Less) Destination="1;410;0;1.00076;0;0.1935;0;0;1;0" Open="false"/>
   <tkinter Coding Basics Destination="1;411;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Making Widgets Destination="1;412;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Geometry Managers Destination="1;412;0;1.00076;0;0.432351;0;0;1;0" Open="false"/>
   <Running GUI Programs Destination="1;413;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Avoiding DOS consoles on Windows Destination="1;413;0;1.00076;0;0.491308;0;0;1;0" Open="false"/>
   </Running GUI Programs>
  </Climbing the GUI Learning Curve>
  <tkinter Coding Alternatives Destination="1;414;0;1.00076;0;0.21164;0;0;1;0" Open="false">
   <Widget Resizing Basics Destination="1;415;0;1.00076;0;0.643991;0;0;1;0" Open="false"/>
   <Configuring Widget Options and Window Titles Destination="1;417;0;1.00076;0;0.473167;0;0;1;0" Open="false"/>
   <One More for Old Times’ Sake Destination="1;418;0;1.00076;0;0.733182;0;0;1;0" Open="false"/>
   <Packing Widgets Without Saving Them Destination="1;419;0;1.00076;0;0.397581;0;0;1;0" Open="false"/>
  </tkinter Coding Alternatives>
  <Adding Buttons and Callbacks Destination="1;421;0;1.00076;0;0.175359;0;0;1;0" Open="false">
   <Widget Resizing Revisited: Expansion Destination="1;422;0;1.00076;0;0.489796;0;0;1;0" Open="false"/>
  </Adding Buttons and Callbacks>
  <Adding User-Defined Callback Handlers Destination="1;424;0;1.00076;0;0.191988;0;0;1;0" Open="false">
   <Lambda Callback Handlers Destination="1;425;0;1.00076;0;0.40514;0;0;1;0" Open="false"/>
   <Deferring Calls with Lambdas and Object References Destination="1;426;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Callback Scope Issues Destination="1;427;0;1.00076;0;0.523054;0;0;1;0" Open="false">
    <Arguments versus globals Destination="1;427;0;1.00076;0;0.65155;0;0;1;0" Open="false"/>
    <Passing in enclosing scope values with default arguments Destination="1;428;0;1.00076;0;0.273621;0;0;1;0" Open="false"/>
    <Passing in enclosing scope values with automatic references Destination="1;429;0;1.00076;0;0.199546;0;0;1;0" Open="false"/>
    <But you must still sometimes use defaults instead of enclosing scopes Destination="1;429;0;1.00076;0;0.77551;0;0;1;0" Open="false"/>
   </Callback Scope Issues>
   <Bound Method Callback Handlers Destination="1;433;0;1.00076;0;0.293273;0;0;1;0" Open="false"/>
   <Callable Class Object Callback Handlers Destination="1;434;0;1.00076;0;0.347695;0;0;1;0" Open="false"/>
   <Other tkinter Callback Protocols Destination="1;435;0;1.00076;0;0.305367;0;0;1;0" Open="false"/>
   <Binding Events Destination="1;436;0;1.00076;0;0.173847;0;0;1;0" Open="false"/>
  </Adding User-Defined Callback Handlers>
  <Adding Multiple Widgets Destination="1;437;0;1.00076;0;0.137566;0;0;1;0" Open="false">
   <Widget Resizing Revisited: Clipping Destination="1;438;0;1.00076;0;0.157218;0;0;1;0" Open="false"/>
   <Attaching Widgets to Frames Destination="1;439;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
   <Layout: Packing Order and Side Attachments Destination="1;439;0;1.00076;0;0.521542;0;0;1;0" Open="false"/>
   <The Packer’s Expand and Fill Revisited Destination="1;440;0;1.00076;0;0.615268;0;0;1;0" Open="false"/>
   <Using Anchor to Position Instead of Stretch Destination="1;441;0;1.00076;0;0.727135;0;0;1;0" Open="false"/>
  </Adding Multiple Widgets>
  <Customizing Widgets with Classes Destination="1;442;0;1.00076;0;0.793651;0;0;1;0" Open="false">
   <Standardizing Behavior and Appearance Destination="1;443;0;1.00076;0;0.763416;0;0;1;0" Open="false">
    <Common behavior Destination="1;444;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Common appearance Destination="1;444;0;1.00076;0;0.606198;0;0;1;0" Open="false"/>
   </Standardizing Behavior and Appearance>
  </Customizing Widgets with Classes>
  <Reusable GUI Components with Classes Destination="1;445;0;1.00076;0;0.666667;0;0;1;0" Open="false">
   <Attaching Class Components Destination="1;447;0;1.00076;0;0.477702;0;0;1;0" Open="false"/>
   <Extending Class Components Destination="1;449;0;1.00076;0;0.173847;0;0;1;0" Open="false"/>
   <Standalone Container Classes Destination="1;450;0;1.00076;0;0.318972;0;0;1;0" Open="false"/>
  </Reusable GUI Components with Classes>
  <The End of the Tutorial Destination="1;452;0;1.00076;0;0.674225;0;0;1;0" Open="false"/>
  <Python/tkinter for Tcl/Tk Converts Destination="1;454;0;1.00076;0;0.335601;0;0;1;0" Open="false"/>
 </Chapter 7. Graphical User Interfaces>
 <Chapter 8. A tkinter Tour, Part 1 Destination="1;457;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Widgets and Gadgets and GUIs, Oh My!” Destination="1;457;0;1.00076;0;0.320484;0;0;1;0" Open="false">
   <This Chapter’s Topics Destination="1;457;0;1.00076;0;0.606198;0;0;1;0" Open="false"/>
  </“Widgets and Gadgets and GUIs, Oh My!”>
  <Configuring Widget Appearance Destination="1;458;0;1.00076;0;0.379441;0;0;1;0" Open="false"/>
  <Top-Level Windows Destination="1;461;0;1.00076;0;0.603175;0;0;1;0" Open="false">
   <Toplevel and Tk Widgets Destination="1;463;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Top-Level Window Protocols Destination="1;464;0;1.00076;0;0.137566;0;0;1;0" Open="false"/>
  </Top-Level Windows>
  <Dialogs Destination="1;468;0;1.00076;0;0.137566;0;0;1;0" Open="false">
   <Standard (Common) Dialogs Destination="1;468;0;1.00076;0;0.480726;0;0;1;0" Open="false">
    <A “smart” and reusable Quit button Destination="1;471;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
    <A dialog demo launcher bar Destination="1;472;0;1.00076;0;0.155707;0;0;1;0" Open="false"/>
    <Printing dialog results and passing callback data with lambdas Destination="1;476;0;1.00076;0;0.609221;0;0;1;0" Open="false"/>
    <Letting users select colors on the fly Destination="1;479;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Other standard dialog calls Destination="1;480;0;1.00076;0;0.184429;0;0;1;0" Open="false"/>
   </Standard (Common) Dialogs>
   <The Old-Style Dialog Module Destination="1;480;0;1.00076;0;0.377929;0;0;1;0" Open="false"/>
   <Custom Dialogs Destination="1;481;0;1.00076;0;0.544218;0;0;1;0" Open="false">
    <Making custom dialogs modal Destination="1;482;0;1.00076;0;0.772487;0;0;1;0" Open="false"/>
    <Other ways to be modal Destination="1;484;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </Custom Dialogs>
  </Dialogs>
  <Binding Events Destination="1;485;0;1.00076;0;0.191988;0;0;1;0" Open="false">
   <Other bind Events Destination="1;489;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <More on <Destroy> events and the quit and destroy methods Destination="1;489;0;1.00076;0;0.805745;0;0;1;0" Open="false"/>
   </Other bind Events>
  </Binding Events>
  <Message and Entry Destination="1;490;0;1.00076;0;0.566893;0;0;1;0" Open="false">
   <Message Destination="1;490;0;1.00076;0;0.684807;0;0;1;0" Open="false"/>
   <Entry Destination="1;491;0;1.00076;0;0.380952;0;0;1;0" Open="false">
    <Programming Entry widgets Destination="1;492;0;1.00076;0;0.515495;0;0;1;0" Open="false"/>
   </Entry>
   <Laying Out Input Forms Destination="1;493;0;1.00076;0;0.3613;0;0;1;0" Open="false">
    <Going modal again Destination="1;494;0;1.00076;0;0.772487;0;0;1;0" Open="false"/>
   </Laying Out Input Forms>
   <tkinter “Variables” and Form Layout Alternatives Destination="1;496;0;1.00076;0;0.346183;0;0;1;0" Open="false"/>
  </Message and Entry>
  <Checkbutton, Radiobutton, and Scale Destination="1;499;0;1.00076;0;0.47619;0;0;1;0" Open="false">
   <Checkbuttons Destination="1;499;0;1.00076;0;0.668178;0;0;1;0" Open="false">
    <Check buttons and variables Destination="1;502;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </Checkbuttons>
   <Radio Buttons Destination="1;504;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Radio buttons and variables Destination="1;505;0;1.00076;0;0.790627;0;0;1;0" Open="false"/>
    <Radio buttons without variables Destination="1;507;0;1.00076;0;0.191988;0;0;1;0" Open="false"/>
    <Hold onto your variables! Destination="1;508;0;1.00076;0;0.340136;0;0;1;0" Open="false"/>
   </Radio Buttons>
   <Scales (Sliders) Destination="1;509;0;1.00076;0;0.393046;0;0;1;0" Open="false">
    <Scales and variables Destination="1;511;0;1.00076;0;0.790627;0;0;1;0" Open="false"/>
   </Scales (Sliders)>
  </Checkbutton, Radiobutton, and Scale>
  <Running GUI Code Three Ways Destination="1;513;0;1.00076;0;0.367347;0;0;1;0" Open="false">
   <Attaching Frames Destination="1;513;0;1.00076;0;0.521542;0;0;1;0" Open="false">
    <Importing by name string Destination="1;515;0;1.00076;0;0.665155;0;0;1;0" Open="false"/>
    <Configuring at construction time Destination="1;516;0;1.00076;0;0.66062;0;0;1;0" Open="false"/>
   </Attaching Frames>
   <Independent Windows Destination="1;518;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Running Programs Destination="1;520;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Launching GUIs as programs other ways: multiprocessing Destination="1;521;0;1.00076;0;0.468632;0;0;1;0" Open="false"/>
    <Cross-program communication Destination="1;522;0;1.00076;0;0.743764;0;0;1;0" Open="false"/>
    <Coding for reusability Destination="1;524;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </Running Programs>
  </Running GUI Code Three Ways>
  <Images Destination="1;526;0;1.00076;0;0.412698;0;0;1;0" Open="false">
   <Fun with Buttons and Pictures Destination="1;529;0;1.00076;0;0.633409;0;0;1;0" Open="false"/>
  </Images>
  <Viewing and Processing Images with PIL Destination="1;533;0;1.00076;0;0.190476;0;0;1;0" Open="false">
   <PIL Basics Destination="1;533;0;1.00076;0;0.545729;0;0;1;0" Open="false"/>
   <Displaying Other Image Types with PIL Destination="1;535;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Displaying all images in a directory Destination="1;537;0;1.00076;0;0.624339;0;0;1;0" Open="false"/>
   </Displaying Other Image Types with PIL>
   <Creating Image Thumbnails with PIL Destination="1;538;0;1.00076;0;0.630385;0;0;1;0" Open="false">
    <Performance: Saving thumbnail files Destination="1;542;0;1.00076;0;0.374906;0;0;1;0" Open="false"/>
    <Layout options: Gridding Destination="1;543;0;1.00076;0;0.356765;0;0;1;0" Open="false"/>
    <Layout options: Fixed-size buttons Destination="1;544;0;1.00076;0;0.640967;0;0;1;0" Open="false"/>
    <Scrolling and canvases (ahead) Destination="1;546;0;1.00076;0;0.754346;0;0;1;0" Open="false"/>
   </Creating Image Thumbnails with PIL>
  </Viewing and Processing Images with PIL>
 </Chapter 8. A tkinter Tour, Part 1>
 <Chapter 9. A tkinter Tour, Part 2 Destination="1;549;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“On Today’s Menu: Spam, Spam, and Spam” Destination="1;549;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
  <Menus Destination="1;549;0;1.00076;0;0.727135;0;0;1;0" Open="false">
   <Top-Level Window Menus Destination="1;550;0;1.00076;0;0.155707;0;0;1;0" Open="false"/>
   <Frame- and Menubutton-Based Menus Destination="1;554;0;1.00076;0;0.125472;0;0;1;0" Open="false">
    <Using Menubuttons and Optionmenus Destination="1;557;0;1.00076;0;0.386999;0;0;1;0" Open="false"/>
   </Frame- and Menubutton-Based Menus>
   <Windows with Both Menus and Toolbars Destination="1;559;0;1.00076;0;0.137566;0;0;1;0" Open="false">
    <Using images in toolbars, too Destination="1;562;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Automating menu construction Destination="1;563;0;1.00076;0;0.736206;0;0;1;0" Open="false"/>
   </Windows with Both Menus and Toolbars>
  </Menus>
  <Listboxes and Scrollbars Destination="1;564;0;1.00076;0;0.46712;0;0;1;0" Open="false">
   <Programming Listboxes Destination="1;566;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Programming Scroll Bars Destination="1;567;0;1.00076;0;0.603175;0;0;1;0" Open="false"/>
   <Packing Scroll Bars Destination="1;568;0;1.00076;0;0.763416;0;0;1;0" Open="false"/>
  </Listboxes and Scrollbars>
  <Text Destination="1;570;0;1.00076;0;0.119426;0;0;1;0" Open="false">
   <Programming the Text Widget Destination="1;572;0;1.00076;0;0.455026;0;0;1;0" Open="false">
    <Text is a Python string Destination="1;572;0;1.00076;0;0.639456;0;0;1;0" Open="false"/>
    <String positions Destination="1;573;0;1.00076;0;0.400605;0;0;1;0" Open="false">
     <Text indexes Destination="1;573;0;1.00076;0;0.583522;0;0;1;0" Open="false"/>
     <Text marks Destination="1;574;0;1.00076;0;0.263039;0;0;1;0" Open="false"/>
     <Text tags Destination="1;574;0;1.00076;0;0.545729;0;0;1;0" Open="false"/>
    </String positions>
   </Programming the Text Widget>
   <Adding Text-Editing Operations Destination="1;575;0;1.00076;0;0.672714;0;0;1;0" Open="false">
    <Using the clipboard Destination="1;578;0;1.00076;0;0.754346;0;0;1;0" Open="false"/>
    <Composition versus inheritance Destination="1;579;0;1.00076;0;0.489796;0;0;1;0" Open="false"/>
    <It’s called “Simple” for a reason: PyEdit (ahead) Destination="1;580;0;1.00076;0;0.386999;0;0;1;0" Open="false"/>
   </Adding Text-Editing Operations>
   <Unicode and the Text Widget Destination="1;580;0;1.00076;0;0.716553;0;0;1;0" Open="false">
    <String types in the Text widget Destination="1;581;0;1.00076;0;0.155707;0;0;1;0" Open="false"/>
    <Unicode text in strings Destination="1;582;0;1.00076;0;0.462585;0;0;1;0" Open="false"/>
    <Unicode text in files Destination="1;585;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Unicode and the Text widget Destination="1;585;0;1.00076;0;0.671202;0;0;1;0" Open="false"/>
    <The problem with treating text as bytes Destination="1;587;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
    <Other binary mode considerations Destination="1;588;0;1.00076;0;0.340136;0;0;1;0" Open="false"/>
    <Supporting Unicode in PyEdit (ahead) Destination="1;589;0;1.00076;0;0.633409;0;0;1;0" Open="false"/>
   </Unicode and the Text Widget>
   <Advanced Text and Tag Operations Destination="1;590;0;1.00076;0;0.25548;0;0;1;0" Open="false"/>
  </Text>
  <Canvas Destination="1;592;0;1.00076;0;0.137566;0;0;1;0" Open="false">
   <Basic Canvas Operations Destination="1;592;0;1.00076;0;0.328042;0;0;1;0" Open="false"/>
   <Programming the Canvas Widget Destination="1;593;0;1.00076;0;0.562358;0;0;1;0" Open="false">
    <Coordinates Destination="1;593;0;1.00076;0;0.672714;0;0;1;0" Open="false"/>
    <Object construction Destination="1;594;0;1.00076;0;0.173847;0;0;1;0" Open="false"/>
    <Object identifiers and operations Destination="1;595;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Canvas object tags Destination="1;595;0;1.00076;0;0.498866;0;0;1;0" Open="false"/>
   </Programming the Canvas Widget>
   <Scrolling Canvases Destination="1;596;0;1.00076;0;0.412698;0;0;1;0" Open="false"/>
   <Scrollable Canvases and Image Thumbnails Destination="1;599;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Scrolling images too: PyPhoto (ahead) Destination="1;602;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </Scrollable Canvases and Image Thumbnails>
   <Using Canvas Events Destination="1;602;0;1.00076;0;0.474679;0;0;1;0" Open="false">
    <Binding events on specific items Destination="1;605;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </Using Canvas Events>
  </Canvas>
  <Grids Destination="1;606;0;1.00076;0;0.347695;0;0;1;0" Open="false">
   <Why Grids? Destination="1;606;0;1.00076;0;0.739229;0;0;1;0" Open="false"/>
   <Grid Basics: Input Forms Revisited Destination="1;607;0;1.00076;0;0.273621;0;0;1;0" Open="false"/>
   <Comparing grid and pack Destination="1;608;0;1.00076;0;0.489796;0;0;1;0" Open="false"/>
   <Combining grid and pack Destination="1;610;0;1.00076;0;0.503401;0;0;1;0" Open="false"/>
   <Making Gridded Widgets Expandable Destination="1;612;0;1.00076;0;0.592593;0;0;1;0" Open="false">
    <Resizing in grids Destination="1;614;0;1.00076;0;0.500378;0;0;1;0" Open="false"/>
    <Spanning columns and rows Destination="1;615;0;1.00076;0;0.391534;0;0;1;0" Open="false"/>
   </Making Gridded Widgets Expandable>
   <Laying Out Larger Tables with grid Destination="1;616;0;1.00076;0;0.231293;0;0;1;0" Open="false"/>
  </Grids>
  <Time Tools, Threads, and Animation Destination="1;624;0;1.00076;0;0.199546;0;0;1;0" Open="false">
   <Using Threads with tkinter GUIs Destination="1;626;0;1.00076;0;0.312925;0;0;1;0" Open="false"/>
   <Using the after Method Destination="1;627;0;1.00076;0;0.585034;0;0;1;0" Open="false">
    <Hiding and redrawing widgets and windows Destination="1;629;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </Using the after Method>
   <Simple Animation Techniques Destination="1;630;0;1.00076;0;0.542706;0;0;1;0" Open="false">
    <Using time.sleep loops Destination="1;631;0;1.00076;0;0.488284;0;0;1;0" Open="false"/>
    <Using widget.after events Destination="1;633;0;1.00076;0;0.444444;0;0;1;0" Open="false"/>
    <Using multiple time.sleep loop threads Destination="1;634;0;1.00076;0;0.594104;0;0;1;0" Open="false"/>
   </Simple Animation Techniques>
   <Other Animation Topics Destination="1;635;0;1.00076;0;0.671202;0;0;1;0" Open="false">
    <Other animation effects Destination="1;636;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Threads and animation Destination="1;636;0;1.00076;0;0.25548;0;0;1;0" Open="false"/>
    <Graphics and gaming toolkits Destination="1;636;0;1.00076;0;0.748299;0;0;1;0" Open="false"/>
   </Other Animation Topics>
  </Time Tools, Threads, and Animation>
  <The End of the Tour Destination="1;637;0;1.00076;0;0.293273;0;0;1;0" Open="false">
   <Other Widgets and Options Destination="1;637;0;1.00076;0;0.465608;0;0;1;0" Open="false"/>
  </The End of the Tour>
 </Chapter 9. A tkinter Tour, Part 2>
 <Chapter 10. GUI Coding Techniques Destination="1;639;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Building a Better Mousetrap” Destination="1;639;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
  <GuiMixin: Common Tool Mixin Classes Destination="1;640;0;1.00076;0;0.273621;0;0;1;0" Open="false">
   <Widget Builder Functions Destination="1;640;0;1.00076;0;0.429327;0;0;1;0" Open="false"/>
   <Mixin Utility Classes Destination="1;641;0;1.00076;0;0.654573;0;0;1;0" Open="false"/>
  </GuiMixin: Common Tool Mixin Classes>
  <GuiMaker: Automating Menus and Toolbars Destination="1;645;0;1.00076;0;0.374906;0;0;1;0" Open="false">
   <Subclass Protocols Destination="1;649;0;1.00076;0;0.201058;0;0;1;0" Open="false"/>
   <GuiMaker Classes Destination="1;650;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <GuiMaker Self-Test Destination="1;650;0;1.00076;0;0.450491;0;0;1;0" Open="false"/>
   <BigGui: A Client Demo Program Destination="1;651;0;1.00076;0;0.517007;0;0;1;0" Open="false"/>
  </GuiMaker: Automating Menus and Toolbars>
  <ShellGui: GUIs for Command-Line Tools Destination="1;655;0;1.00076;0;0.207105;0;0;1;0" Open="false">
   <A Generic Shell-Tools Display Destination="1;655;0;1.00076;0;0.480726;0;0;1;0" Open="false"/>
   <Application-Specific Tool Set Classes Destination="1;657;0;1.00076;0;0.40514;0;0;1;0" Open="false"/>
   <Adding GUI Frontends to Command Lines Destination="1;659;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Non-GUI scripts Destination="1;659;0;1.00076;0;0.187453;0;0;1;0" Open="false"/>
    <GUI input dialogs Destination="1;661;0;1.00076;0;0.284203;0;0;1;0" Open="false"/>
    <Room for improvement Destination="1;664;0;1.00076;0;0.44898;0;0;1;0" Open="false"/>
   </Adding GUI Frontends to Command Lines>
  </ShellGui: GUIs for Command-Line Tools>
  <GuiStreams: Redirecting Streams to Widgets Destination="1;665;0;1.00076;0;0.325019;0;0;1;0" Open="false">
   <Using Redirection for the Packing Scripts Destination="1;669;0;1.00076;0;0.374906;0;0;1;0" Open="false"/>
  </GuiStreams: Redirecting Streams to Widgets>
  <Reloading Callback Handlers Dynamically Destination="1;670;0;1.00076;0;0.424792;0;0;1;0" Open="false"/>
  <Wrapping Up Top-Level Window Interfaces Destination="1;672;0;1.00076;0;0.515495;0;0;1;0" Open="false"/>
  <GUIs, Threads, and Queues Destination="1;677;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <Placing Data on Queues Destination="1;678;0;1.00076;0;0.597128;0;0;1;0" Open="false">
    <Recoding with classes and bound methods Destination="1;680;0;1.00076;0;0.468632;0;0;1;0" Open="false"/>
    <Thread exits in GUIs Destination="1;681;0;1.00076;0;0.539683;0;0;1;0" Open="false"/>
   </Placing Data on Queues>
   <Placing Callbacks on Queues Destination="1;682;0;1.00076;0;0.119426;0;0;1;0" Open="false">
    <Passing bound method callbacks on queues Destination="1;686;0;1.00076;0;0.696901;0;0;1;0" Open="false"/>
   </Placing Callbacks on Queues>
  </GUIs, Threads, and Queues>
  <More Ways to Add GUIs to Non-GUI Code Destination="1;688;0;1.00076;0;0.725624;0;0;1;0" Open="false">
   <Popping Up GUI Windows on Demand Destination="1;689;0;1.00076;0;0.46712;0;0;1;0" Open="false"/>
   <Adding a GUI As a Separate Program: Sockets (A Second Look) Destination="1;691;0;1.00076;0;0.739229;0;0;1;0" Open="false"/>
   <Adding a GUI As a Separate Program: Command Pipes Destination="1;696;0;1.00076;0;0.353741;0;0;1;0" Open="false">
    <The specter of blocking input calls Destination="1;698;0;1.00076;0;0.663643;0;0;1;0" Open="false"/>
    <Updating GUIs within threads…and other nonsolutions Destination="1;699;0;1.00076;0;0.281179;0;0;1;0" Open="false"/>
    <Avoiding blocking input calls with non-GUI threads Destination="1;700;0;1.00076;0;0.263039;0;0;1;0" Open="false"/>
    <Sockets and pipes: Compare and contrast Destination="1;701;0;1.00076;0;0.686319;0;0;1;0" Open="false"/>
    <Other uses for threaded pipe GUIs Destination="1;702;0;1.00076;0;0.474679;0;0;1;0" Open="false"/>
   </Adding a GUI As a Separate Program: Command Pipes>
  </More Ways to Add GUIs to Non-GUI Code>
  <The PyDemos and PyGadgets Launchers Destination="1;704;0;1.00076;0;0.119426;0;0;1;0" Open="false">
   <PyDemos Launcher Bar (Mostly External) Destination="1;704;0;1.00076;0;0.686319;0;0;1;0" Open="false"/>
   <PyGadgets Launcher Bar Destination="1;709;0;1.00076;0;0.675737;0;0;1;0" Open="false"/>
  </The PyDemos and PyGadgets Launchers>
 </Chapter 10. GUI Coding Techniques>
 <Chapter 11. Complete GUI Programs Destination="1;713;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Python, Open Source, and Camaros” Destination="1;713;0;1.00076;0;0.320484;0;0;1;0" Open="false">
   <Examples in Other Chapters Destination="1;714;0;1.00076;0;0.293273;0;0;1;0" Open="false"/>
   <This Chapter’s Strategy Destination="1;715;0;1.00076;0;0.181406;0;0;1;0" Open="false"/>
  </“Python, Open Source, and Camaros”>
  <PyEdit: A Text Editor Program/Object Destination="1;716;0;1.00076;0;0.680272;0;0;1;0" Open="false">
   <Running PyEdit Destination="1;717;0;1.00076;0;0.689342;0;0;1;0" Open="false">
    <Menus and toolbars Destination="1;718;0;1.00076;0;0.631897;0;0;1;0" Open="false"/>
    <Dialogs Destination="1;719;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Running program code Destination="1;719;0;1.00076;0;0.754346;0;0;1;0" Open="false"/>
    <Multiple windows Destination="1;720;0;1.00076;0;0.432351;0;0;1;0" Open="false"/>
    <Other PyEdit examples and screenshots in this book Destination="1;724;0;1.00076;0;0.477702;0;0;1;0" Open="false"/>
   </Running PyEdit>
   <PyEdit Changes in Version 2.0 (Third Edition) Destination="1;724;0;1.00076;0;0.715042;0;0;1;0" Open="false">
    <Font dialog Destination="1;725;0;1.00076;0;0.261527;0;0;1;0" Open="false"/>
    <Undo, redo, and modified tests Destination="1;725;0;1.00076;0;0.417234;0;0;1;0" Open="false"/>
    <Configuration module Destination="1;725;0;1.00076;0;0.692366;0;0;1;0" Open="false"/>
   </PyEdit Changes in Version 2.0 (Third Edition)>
   <PyEdit Changes in Version 2.1 (Fourth Edition) Destination="1;726;0;1.00076;0;0.119426;0;0;1;0" Open="false">
    <Modal dialog state fix Destination="1;726;0;1.00076;0;0.643991;0;0;1;0" Open="false"/>
    <Cross-process change tests on Quit Destination="1;727;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
    <New Grep dialog: Threaded and Unicode-aware file tree search Destination="1;727;0;1.00076;0;0.430839;0;0;1;0" Open="false">
     <Grep threading model Destination="1;727;0;1.00076;0;0.752834;0;0;1;0" Open="false"/>
     <Grep Unicode model Destination="1;728;0;1.00076;0;0.273621;0;0;1;0" Open="false"/>
    </New Grep dialog: Threaded and Unicode-aware file tree search>
    <Update for initial positioning Destination="1;729;0;1.00076;0;0.311413;0;0;1;0" Open="false"/>
    <Improvements for running code Destination="1;729;0;1.00076;0;0.696901;0;0;1;0" Open="false"/>
    <Unicode (Internationalized) text support Destination="1;730;0;1.00076;0;0.452003;0;0;1;0" Open="false">
     <Unicode file and display model Destination="1;730;0;1.00076;0;0.831444;0;0;1;0" Open="false"/>
     <Unicode options and choices Destination="1;732;0;1.00076;0;0.740741;0;0;1;0" Open="false"/>
    </Unicode (Internationalized) text support>
    <More on Quit checks: The <Destroy> event revisited Destination="1;734;0;1.00076;0;0.517007;0;0;1;0" Open="false"/>
   </PyEdit Changes in Version 2.1 (Fourth Edition)>
   <PyEdit Source Code Destination="1;735;0;1.00076;0;0.787604;0;0;1;0" Open="false">
    <User configurations file Destination="1;736;0;1.00076;0;0.273621;0;0;1;0" Open="false"/>
    <Windows (and other) launch files Destination="1;737;0;1.00076;0;0.589569;0;0;1;0" Open="false"/>
    <Main implementation file Destination="1;738;0;1.00076;0;0.67876;0;0;1;0" Open="false"/>
   </PyEdit Source Code>
  </PyEdit: A Text Editor Program/Object>
  <PyPhoto: An Image Viewer and Resizer Destination="1;758;0;1.00076;0;0.705971;0;0;1;0" Open="false">
   <Running PyPhoto Destination="1;759;0;1.00076;0;0.400605;0;0;1;0" Open="false"/>
   <PyPhoto Source Code Destination="1;761;0;1.00076;0;0.686319;0;0;1;0" Open="false"/>
  </PyPhoto: An Image Viewer and Resizer>
  <PyView: An Image and Notes Slideshow Destination="1;769;0;1.00076;0;0.459562;0;0;1;0" Open="false">
   <Running PyView Destination="1;769;0;1.00076;0;0.613757;0;0;1;0" Open="false">
    <Embedding PyEdit in PyView Destination="1;771;0;1.00076;0;0.687831;0;0;1;0" Open="false"/>
   </Running PyView>
   <PyView Source Code Destination="1;774;0;1.00076;0;0.311413;0;0;1;0" Open="false"/>
  </PyView: An Image and Notes Slideshow>
  <PyDraw: Painting and Moving Graphics Destination="1;780;0;1.00076;0;0.119426;0;0;1;0" Open="false">
   <Running PyDraw Destination="1;780;0;1.00076;0;0.309902;0;0;1;0" Open="false"/>
   <PyDraw Source Code Destination="1;780;0;1.00076;0;0.739229;0;0;1;0" Open="false"/>
  </PyDraw: Painting and Moving Graphics>
  <PyClock: An Analog/Digital Clock Widget Destination="1;789;0;1.00076;0;0.110355;0;0;1;0" Open="false">
   <A Quick Geometry Lesson Destination="1;789;0;1.00076;0;0.338624;0;0;1;0" Open="false"/>
   <Running PyClock Destination="1;793;0;1.00076;0;0.403628;0;0;1;0" Open="false"/>
   <PyClock Source Code Destination="1;796;0;1.00076;0;0.681784;0;0;1;0" Open="false"/>
  </PyClock: An Analog/Digital Clock Widget>
  <PyToe: A Tic-Tac-Toe Game Widget Destination="1;804;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <Running PyToe Destination="1;804;0;1.00076;0;0.412698;0;0;1;0" Open="false"/>
   <PyToe Source Code (External) Destination="1;805;0;1.00076;0;0.56387;0;0;1;0" Open="false"/>
  </PyToe: A Tic-Tac-Toe Game Widget>
  <Where to Go from Here Destination="1;808;0;1.00076;0;0.749811;0;0;1;0" Open="false"/>
 </Chapter 11. Complete GUI Programs>
</Part III. GUI Programming>
<Part IV. Internet Programming Destination="1;811;0;1.00076;0;0.0786092;0;0;1;0" Open="false">
 <Chapter 12. Network Scripting Destination="1;813;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Tune In, Log On, and Drop Out” Destination="1;813;0;1.00076;0;0.320484;0;0;1;0" Open="false">
   <Internet Scripting Topics Destination="1;814;0;1.00076;0;0.44898;0;0;1;0" Open="false">
    <What we will cover Destination="1;815;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
    <What we won’t cover Destination="1;816;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
    <Other themes in this part of the book Destination="1;816;0;1.00076;0;0.568405;0;0;1;0" Open="false"/>
   </Internet Scripting Topics>
   <Running Examples in This Part of the Book Destination="1;817;0;1.00076;0;0.429327;0;0;1;0" Open="false"/>
  </“Tune In, Log On, and Drop Out”>
  <Python Internet Development Options Destination="1;819;0;1.00076;0;0.226757;0;0;1;0" Open="false"/>
  <Plumbing the Internet Destination="1;822;0;1.00076;0;0.610733;0;0;1;0" Open="false">
   <The Socket Layer Destination="1;823;0;1.00076;0;0.119426;0;0;1;0" Open="false">
    <Machine identifiers Destination="1;823;0;1.00076;0;0.539683;0;0;1;0" Open="false"/>
   </The Socket Layer>
   <The Protocol Layer Destination="1;824;0;1.00076;0;0.721088;0;0;1;0" Open="false">
    <Port number rules Destination="1;825;0;1.00076;0;0.30839;0;0;1;0" Open="false"/>
    <Clients and servers Destination="1;825;0;1.00076;0;0.748299;0;0;1;0" Open="false"/>
    <Protocol structures Destination="1;826;0;1.00076;0;0.737717;0;0;1;0" Open="false"/>
   </The Protocol Layer>
   <Python’s Internet Library Modules Destination="1;827;0;1.00076;0;0.311413;0;0;1;0" Open="false"/>
  </Plumbing the Internet>
  <Socket Programming Destination="1;829;0;1.00076;0;0.300831;0;0;1;0" Open="false">
   <Socket Basics Destination="1;830;0;1.00076;0;0.513983;0;0;1;0" Open="false">
    <Server socket calls Destination="1;832;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Transferring byte strings and objects Destination="1;833;0;1.00076;0;0.663643;0;0;1;0" Open="false"/>
    <Client socket calls Destination="1;834;0;1.00076;0;0.758881;0;0;1;0" Open="false"/>
   </Socket Basics>
   <Running Socket Programs Locally Destination="1;836;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Running Socket Programs Remotely Destination="1;837;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Socket pragmatics Destination="1;838;0;1.00076;0;0.675737;0;0;1;0" Open="false"/>
   </Running Socket Programs Remotely>
   <Spawning Clients in Parallel Destination="1;840;0;1.00076;0;0.482237;0;0;1;0" Open="false">
    <Preview: Denied client connections Destination="1;841;0;1.00076;0;0.659108;0;0;1;0" Open="false"/>
   </Spawning Clients in Parallel>
   <Talking to Reserved Ports Destination="1;843;0;1.00076;0;0.25548;0;0;1;0" Open="false">
    <Binding reserved port servers Destination="1;844;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
   </Talking to Reserved Ports>
  </Socket Programming>
  <Handling Multiple Clients Destination="1;844;0;1.00076;0;0.62585;0;0;1;0" Open="false">
   <Forking Servers Destination="1;845;0;1.00076;0;0.273621;0;0;1;0" Open="false">
    <Running the forking server Destination="1;846;0;1.00076;0;0.343159;0;0;1;0" Open="false"/>
    <Other run modes: Local servers with Cygwin and remote clients Destination="1;848;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
    <Forked processes and sockets Destination="1;849;0;1.00076;0;0.204082;0;0;1;0" Open="false"/>
    <Exiting from children Destination="1;849;0;1.00076;0;0.397581;0;0;1;0" Open="false"/>
    <Killing the zombies: Don’t fear the reaper! Destination="1;849;0;1.00076;0;0.654573;0;0;1;0" Open="false"/>
    <Preventing zombies with signal handlers on Linux Destination="1;851;0;1.00076;0;0.462585;0;0;1;0" Open="false"/>
    <Why multiprocessing doesn’t help with socket server portability Destination="1;855;0;1.00076;0;0.512472;0;0;1;0" Open="false"/>
   </Forking Servers>
   <Threading Servers Destination="1;857;0;1.00076;0;0.506425;0;0;1;0" Open="false"/>
   <Standard Library Server Classes Destination="1;860;0;1.00076;0;0.284203;0;0;1;0" Open="false"/>
   <Multiplexing Servers with select Destination="1;862;0;1.00076;0;0.119426;0;0;1;0" Open="false">
    <A select-based echo server Destination="1;863;0;1.00076;0;0.293273;0;0;1;0" Open="false"/>
    <Running the select server Destination="1;865;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </Multiplexing Servers with select>
   <Summary: Choosing a Server Scheme Destination="1;868;0;1.00076;0;0.30839;0;0;1;0" Open="false"/>
  </Handling Multiple Clients>
  <Making Sockets Look Like Files and Streams Destination="1;869;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <A Stream Redirection Utility Destination="1;870;0;1.00076;0;0.237339;0;0;1;0" Open="false">
    <Text-mode files and buffered output streams Destination="1;874;0;1.00076;0;0.719577;0;0;1;0" Open="false"/>
    <Stream requirements Destination="1;876;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
    <Line buffering Destination="1;877;0;1.00076;0;0.491308;0;0;1;0" Open="false"/>
    <Solutions Destination="1;879;0;1.00076;0;0.263039;0;0;1;0" Open="false"/>
    <Buffering in other contexts: Command pipes revisited Destination="1;880;0;1.00076;0;0.173847;0;0;1;0" Open="false"/>
    <Sockets versus command pipes Destination="1;881;0;1.00076;0;0.252457;0;0;1;0" Open="false"/>
   </A Stream Redirection Utility>
  </Making Sockets Look Like Files and Streams>
  <A Simple Python File Server Destination="1;882;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <Running the File Server and Clients Destination="1;884;0;1.00076;0;0.220711;0;0;1;0" Open="false"/>
   <Adding a User-Interface Frontend Destination="1;885;0;1.00076;0;0.303855;0;0;1;0" Open="false">
    <Using row frames and command lines Destination="1;885;0;1.00076;0;0.606198;0;0;1;0" Open="false"/>
    <Using grids and function calls Destination="1;887;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
    <Using a reusable form-layout class Destination="1;888;0;1.00076;0;0.486772;0;0;1;0" Open="false"/>
   </Adding a User-Interface Frontend>
  </A Simple Python File Server>
 </Chapter 12. Network Scripting>
 <Chapter 13. Client-Side Scripting Destination="1;895;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Socket to Me!” Destination="1;895;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
  <FTP: Transferring Files over the Net Destination="1;896;0;1.00076;0;0.173847;0;0;1;0" Open="false"/>
  <Transferring Files with ftplib Destination="1;896;0;1.00076;0;0.603175;0;0;1;0" Open="false">
   <Using urllib to Download Files Destination="1;899;0;1.00076;0;0.698413;0;0;1;0" Open="false"/>
   <FTP get and put Utilities Destination="1;902;0;1.00076;0;0.21164;0;0;1;0" Open="false">
    <Download utility Destination="1;903;0;1.00076;0;0.321995;0;0;1;0" Open="false"/>
    <Upload utility Destination="1;906;0;1.00076;0;0.356765;0;0;1;0" Open="false"/>
    <Playing the Monty Python theme song Destination="1;907;0;1.00076;0;0.553288;0;0;1;0" Open="false"/>
   </FTP get and put Utilities>
   <Adding a User Interface Destination="1;909;0;1.00076;0;0.272109;0;0;1;0" Open="false"/>
  </Transferring Files with ftplib>
  <Transferring Directories with ftplib Destination="1;916;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <Downloading Site Directories Destination="1;916;0;1.00076;0;0.504913;0;0;1;0" Open="false"/>
   <Uploading Site Directories Destination="1;922;0;1.00076;0;0.408163;0;0;1;0" Open="false"/>
   <Refactoring Uploads and Downloads for Reuse Destination="1;926;0;1.00076;0;0.270597;0;0;1;0" Open="false">
    <Refactoring with functions Destination="1;926;0;1.00076;0;0.654573;0;0;1;0" Open="false"/>
    <Refactoring with classes Destination="1;930;0;1.00076;0;0.548753;0;0;1;0" Open="false"/>
   </Refactoring Uploads and Downloads for Reuse>
  </Transferring Directories with ftplib>
  <Transferring Directory Trees with ftplib Destination="1;934;0;1.00076;0;0.749811;0;0;1;0" Open="false">
   <Uploading Local Trees Destination="1;935;0;1.00076;0;0.155707;0;0;1;0" Open="false"/>
   <Deleting Remote Trees Destination="1;937;0;1.00076;0;0.715042;0;0;1;0" Open="false"/>
   <Downloading Remote Trees Destination="1;941;0;1.00076;0;0.284203;0;0;1;0" Open="false"/>
  </Transferring Directory Trees with ftplib>
  <Processing Internet Email Destination="1;941;0;1.00076;0;0.568405;0;0;1;0" Open="false">
   <Unicode in Python 3.X and Email Tools Destination="1;942;0;1.00076;0;0.347695;0;0;1;0" Open="false"/>
  </Processing Internet Email>
  <POP: Fetching Email Destination="1;943;0;1.00076;0;0.740741;0;0;1;0" Open="false">
   <Mail Configuration Module Destination="1;944;0;1.00076;0;0.748299;0;0;1;0" Open="false"/>
   <POP Mail Reader Script Destination="1;947;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Fetching Messages Destination="1;948;0;1.00076;0;0.73167;0;0;1;0" Open="false"/>
   <Fetching Email at the Interactive Prompt Destination="1;951;0;1.00076;0;0.185941;0;0;1;0" Open="false"/>
  </POP: Fetching Email>
  <SMTP: Sending Email Destination="1;952;0;1.00076;0;0.433862;0;0;1;0" Open="false">
   <SMTP Mail Sender Script Destination="1;953;0;1.00076;0;0.556311;0;0;1;0" Open="false"/>
   <Sending Messages Destination="1;955;0;1.00076;0;0.66969;0;0;1;0" Open="false">
    <Verifying receipt Destination="1;957;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Manipulating both From and To Destination="1;958;0;1.00076;0;0.383976;0;0;1;0" Open="false"/>
   </Sending Messages>
   <Sending Email at the Interactive Prompt Destination="1;961;0;1.00076;0;0.752834;0;0;1;0" Open="false"/>
  </SMTP: Sending Email>
  <email: Parsing and Composing Mail Content Destination="1;963;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <Message Objects Destination="1;964;0;1.00076;0;0.155707;0;0;1;0" Open="false"/>
   <Basic email Package Interfaces in Action Destination="1;966;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Handling multipart messages Destination="1;967;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </Basic email Package Interfaces in Action>
   <Unicode, Internationalization, and the Python 3.1 email Package Destination="1;968;0;1.00076;0;0.591081;0;0;1;0" Open="false">
    <Parser decoding requirement Destination="1;969;0;1.00076;0;0.748299;0;0;1;0" Open="false"/>
    <Text payload encodings: Handling mixed type results Destination="1;971;0;1.00076;0;0.773998;0;0;1;0" Open="false"/>
    <Text payload encodings: Using header information to decode Destination="1;973;0;1.00076;0;0.575964;0;0;1;0" Open="false"/>
    <Message header encodings: email package support Destination="1;975;0;1.00076;0;0.736206;0;0;1;0" Open="false"/>
    <Message address header encodings and parsing, and header creation Destination="1;977;0;1.00076;0;0.418745;0;0;1;0" Open="false"/>
    <Workaround: Message text generation for binary attachment payloads is broken Destination="1;980;0;1.00076;0;0.21164;0;0;1;0" Open="false"/>
    <Workaround: Message composition for non-ASCII text parts is broken Destination="1;983;0;1.00076;0;0.657596;0;0;1;0" Open="false"/>
    <Summary: Solutions and workarounds Destination="1;988;0;1.00076;0;0.671202;0;0;1;0" Open="false"/>
   </Unicode, Internationalization, and the Python 3.1 email Package>
  </email: Parsing and Composing Mail Content>
  <A Console-Based Email Client Destination="1;989;0;1.00076;0;0.687831;0;0;1;0" Open="false">
   <Running the pymail Console Client Destination="1;994;0;1.00076;0;0.594104;0;0;1;0" Open="false"/>
  </A Console-Based Email Client>
  <The mailtools Utility Package Destination="1;998;0;1.00076;0;0.436886;0;0;1;0" Open="false">
   <Initialization File Destination="1;999;0;1.00076;0;0.631897;0;0;1;0" Open="false"/>
   <MailTool Class Destination="1;1000;0;1.00076;0;0.643991;0;0;1;0" Open="false"/>
   <MailSender Class Destination="1;1001;0;1.00076;0;0.296296;0;0;1;0" Open="false">
    <Unicode issues for attachments, save files, and headers Destination="1;1001;0;1.00076;0;0.517007;0;0;1;0" Open="false"/>
   </MailSender Class>
   <MailFetcher Class Destination="1;1009;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <General usage Destination="1;1009;0;1.00076;0;0.169312;0;0;1;0" Open="false"/>
    <Unicode decoding for full mail text on fetches Destination="1;1009;0;1.00076;0;0.544218;0;0;1;0" Open="false"/>
    <Inbox synchronization tools Destination="1;1010;0;1.00076;0;0.521542;0;0;1;0" Open="false"/>
   </MailFetcher Class>
   <MailParser Class Destination="1;1018;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Unicode decoding for text part payloads and message headers Destination="1;1018;0;1.00076;0;0.279667;0;0;1;0" Open="false"/>
   </MailParser Class>
   <Self-Test Script Destination="1;1025;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Running the self-test Destination="1;1026;0;1.00076;0;0.314437;0;0;1;0" Open="false"/>
   </Self-Test Script>
   <Updating the pymail Console Client Destination="1;1028;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Running the pymail2 console client Destination="1;1031;0;1.00076;0;0.125472;0;0;1;0" Open="false"/>
   </Updating the pymail Console Client>
  </The mailtools Utility Package>
  <NNTP: Accessing Newsgroups Destination="1;1033;0;1.00076;0;0.761905;0;0;1;0" Open="false"/>
  <HTTP: Accessing Websites Destination="1;1036;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  <The urllib Package Revisited Destination="1;1039;0;1.00076;0;0.256992;0;0;1;0" Open="false">
   <Other urllib Interfaces Destination="1;1041;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Invoking programs and escaping text Destination="1;1042;0;1.00076;0;0.787604;0;0;1;0" Open="false"/>
   </Other urllib Interfaces>
  </The urllib Package Revisited>
  <Other Client-Side Scripting Options Destination="1;1044;0;1.00076;0;0.456538;0;0;1;0" Open="false"/>
 </Chapter 13. Client-Side Scripting>
 <Chapter 14. The PyMailGUI Client Destination="1;1047;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Use the Source, Luke” Destination="1;1047;0;1.00076;0;0.320484;0;0;1;0" Open="false">
   <Source Code Modules and Size Destination="1;1048;0;1.00076;0;0.21164;0;0;1;0" Open="false">
    <Code size Destination="1;1049;0;1.00076;0;0.41421;0;0;1;0" Open="false"/>
    <Code Structure Destination="1;1050;0;1.00076;0;0.25548;0;0;1;0" Open="false"/>
   </Source Code Modules and Size>
   <Why PyMailGUI? Destination="1;1050;0;1.00076;0;0.745276;0;0;1;0" Open="false"/>
   <Running PyMailGUI Destination="1;1052;0;1.00076;0;0.275132;0;0;1;0" Open="false"/>
   <Presentation Strategy Destination="1;1052;0;1.00076;0;0.640967;0;0;1;0" Open="false"/>
  </“Use the Source, Luke”>
  <Major PyMailGUI Changes Destination="1;1053;0;1.00076;0;0.462585;0;0;1;0" Open="false">
   <New in Version 2.1 and 2.0 (Third Edition) Destination="1;1053;0;1.00076;0;0.598639;0;0;1;0" Open="false"/>
   <New in Version 3.0 (Fourth Edition) Destination="1;1054;0;1.00076;0;0.781557;0;0;1;0" Open="false">
    <Version 3.0 Unicode support policies Destination="1;1059;0;1.00076;0;0.326531;0;0;1;0" Open="false"/>
   </New in Version 3.0 (Fourth Edition)>
  </Major PyMailGUI Changes>
  <A PyMailGUI Demo Destination="1;1061;0;1.00076;0;0.622827;0;0;1;0" Open="false">
   <Getting Started Destination="1;1062;0;1.00076;0;0.329554;0;0;1;0" Open="false"/>
   <Loading Mail Destination="1;1067;0;1.00076;0;0.795163;0;0;1;0" Open="false"/>
   <Threading Model Destination="1;1069;0;1.00076;0;0.560847;0;0;1;0" Open="false">
    <Threading model implementation Destination="1;1071;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </Threading Model>
   <Load Server Interface Destination="1;1072;0;1.00076;0;0.261527;0;0;1;0" Open="false"/>
   <Offline Processing with Save and Open Destination="1;1073;0;1.00076;0;0.727135;0;0;1;0" Open="false"/>
   <Sending Email and Attachments Destination="1;1075;0;1.00076;0;0.689342;0;0;1;0" Open="false"/>
   <Viewing Email and Attachments Destination="1;1079;0;1.00076;0;0.21164;0;0;1;0" Open="false"/>
   <Email Replies and Forwards and Recipient Options Destination="1;1085;0;1.00076;0;0.761905;0;0;1;0" Open="false"/>
   <Deleting Email Destination="1;1091;0;1.00076;0;0.529101;0;0;1;0" Open="false"/>
   <POP Message Numbers and Synchronization Destination="1;1093;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
   <Handling HTML Content in Email Destination="1;1095;0;1.00076;0;0.191988;0;0;1;0" Open="false"/>
   <Mail Content Internationalization Support Destination="1;1097;0;1.00076;0;0.155707;0;0;1;0" Open="false"/>
   <Alternative Configurations and Accounts Destination="1;1101;0;1.00076;0;0.553288;0;0;1;0" Open="false"/>
   <Multiple Windows and Status Messages Destination="1;1102;0;1.00076;0;0.480726;0;0;1;0" Open="false"/>
  </A PyMailGUI Demo>
  <PyMailGUI Implementation Destination="1;1104;0;1.00076;0;0.386999;0;0;1;0" Open="false">
   <PyMailGUI: The Main Module Destination="1;1105;0;1.00076;0;0.699924;0;0;1;0" Open="false"/>
   <SharedNames: Program-Wide Globals Destination="1;1108;0;1.00076;0;0.400605;0;0;1;0" Open="false"/>
   <ListWindows: Message List Windows Destination="1;1109;0;1.00076;0;0.763416;0;0;1;0" Open="false"/>
   <ViewWindows: Message View Windows Destination="1;1127;0;1.00076;0;0.415722;0;0;1;0" Open="false"/>
   <messagecache: Message Cache Manager Destination="1;1137;0;1.00076;0;0.545729;0;0;1;0" Open="false"/>
   <popuputil: General-Purpose GUI Pop Ups Destination="1;1140;0;1.00076;0;0.690854;0;0;1;0" Open="false"/>
   <wraplines: Line Split Tools Destination="1;1142;0;1.00076;0;0.589569;0;0;1;0" Open="false"/>
   <html2text: Extracting Text from HTML (Prototype, Preview) Destination="1;1144;0;1.00076;0;0.748299;0;0;1;0" Open="false"/>
   <mailconfig: User Configurations Destination="1;1147;0;1.00076;0;0.696901;0;0;1;0" Open="false"/>
   <textConfig: Customizing Pop-Up PyEdit Windows Destination="1;1152;0;1.00076;0;0.517007;0;0;1;0" Open="false"/>
   <PyMailGUIHelp: User Help Text and Display Destination="1;1153;0;1.00076;0;0.139078;0;0;1;0" Open="false"/>
   <altconfigs: Configuring for Multiple Accounts Destination="1;1156;0;1.00076;0;0.182918;0;0;1;0" Open="false"/>
  </PyMailGUI Implementation>
  <Ideas for Improvement Destination="1;1158;0;1.00076;0;0.485261;0;0;1;0" Open="false"/>
 </Chapter 14. The PyMailGUI Client>
 <Chapter 15. Server-Side Scripting Destination="1;1167;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Oh, What a Tangled Web We Weave” Destination="1;1167;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
  <What’s a Server-Side CGI Script? Destination="1;1168;0;1.00076;0;0.338624;0;0;1;0" Open="false">
   <The Script Behind the Curtain Destination="1;1168;0;1.00076;0;0.78458;0;0;1;0" Open="false"/>
   <Writing CGI Scripts in Python Destination="1;1170;0;1.00076;0;0.600151;0;0;1;0" Open="false"/>
  </What’s a Server-Side CGI Script?>
  <Running Server-Side Examples Destination="1;1172;0;1.00076;0;0.137566;0;0;1;0" Open="false">
   <Web Server Options Destination="1;1172;0;1.00076;0;0.436886;0;0;1;0" Open="false"/>
   <Running a Local Web Server Destination="1;1173;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
   <The Server-Side Examples Root Page Destination="1;1175;0;1.00076;0;0.191988;0;0;1;0" Open="false"/>
   <Viewing Server-Side Examples and Output Destination="1;1176;0;1.00076;0;0.293273;0;0;1;0" Open="false"/>
  </Running Server-Side Examples>
  <Climbing the CGI Learning Curve Destination="1;1177;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <A First Web Page Destination="1;1177;0;1.00076;0;0.293273;0;0;1;0" Open="false">
    <HTML basics Destination="1;1178;0;1.00076;0;0.417234;0;0;1;0" Open="false"/>
    <Internet addresses (URLs) Destination="1;1179;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Using minimal URLs Destination="1;1181;0;1.00076;0;0.45805;0;0;1;0" Open="false"/>
    <HTML file permission constraints Destination="1;1182;0;1.00076;0;0.553288;0;0;1;0" Open="false"/>
   </A First Web Page>
   <A First CGI Script Destination="1;1183;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Installing CGI scripts Destination="1;1184;0;1.00076;0;0.523054;0;0;1;0" Open="false"/>
    <Finding Python on remote servers Destination="1;1187;0;1.00076;0;0.252457;0;0;1;0" Open="false"/>
   </A First CGI Script>
   <Adding Pictures and Generating Tables Destination="1;1188;0;1.00076;0;0.25548;0;0;1;0" Open="false">
    <Table tags Destination="1;1190;0;1.00076;0;0.648526;0;0;1;0" Open="false"/>
   </Adding Pictures and Generating Tables>
   <Adding User Interaction Destination="1;1191;0;1.00076;0;0.364324;0;0;1;0" Open="false">
    <Submission page Destination="1;1191;0;1.00076;0;0.51096;0;0;1;0" Open="false"/>
    <More on form tags Destination="1;1192;0;1.00076;0;0.47619;0;0;1;0" Open="false"/>
    <Response script Destination="1;1194;0;1.00076;0;0.199546;0;0;1;0" Open="false"/>
    <Passing parameters in URLs Destination="1;1195;0;1.00076;0;0.754346;0;0;1;0" Open="false"/>
    <Testing outside browsers with the module urllib.request Destination="1;1197;0;1.00076;0;0.790627;0;0;1;0" Open="false"/>
   </Adding User Interaction>
   <Using Tables to Lay Out Forms Destination="1;1199;0;1.00076;0;0.657596;0;0;1;0" Open="false">
    <Converting strings in CGI scripts Destination="1;1203;0;1.00076;0;0.137566;0;0;1;0" Open="false"/>
    <Debugging CGI scripts Destination="1;1203;0;1.00076;0;0.606198;0;0;1;0" Open="false"/>
   </Using Tables to Lay Out Forms>
   <Adding Common Input Devices Destination="1;1205;0;1.00076;0;0.40514;0;0;1;0" Open="false"/>
   <Changing Input Layouts Destination="1;1208;0;1.00076;0;0.541194;0;0;1;0" Open="false">
    <Keeping display and logic separate Destination="1;1211;0;1.00076;0;0.497354;0;0;1;0" Open="false"/>
   </Changing Input Layouts>
   <Passing Parameters in Hardcoded URLs Destination="1;1212;0;1.00076;0;0.137566;0;0;1;0" Open="false"/>
   <Passing Parameters in Hidden Form Fields Destination="1;1214;0;1.00076;0;0.574452;0;0;1;0" Open="false"/>
  </Climbing the CGI Learning Curve>
  <Saving State Information in CGI Scripts Destination="1;1216;0;1.00076;0;0.557823;0;0;1;0" Open="false">
   <URL Query Parameters Destination="1;1218;0;1.00076;0;0.164777;0;0;1;0" Open="false"/>
   <Hidden Form Input Fields Destination="1;1218;0;1.00076;0;0.772487;0;0;1;0" Open="false"/>
   <HTTP “Cookies” Destination="1;1219;0;1.00076;0;0.500378;0;0;1;0" Open="false">
    <Creating a cookie Destination="1;1220;0;1.00076;0;0.237339;0;0;1;0" Open="false"/>
    <Receiving a cookie Destination="1;1221;0;1.00076;0;0.241875;0;0;1;0" Open="false"/>
    <Using cookies in CGI scripts Destination="1;1221;0;1.00076;0;0.610733;0;0;1;0" Open="false"/>
    <Handling cookies with the urllib.request module Destination="1;1222;0;1.00076;0;0.509448;0;0;1;0" Open="false"/>
   </HTTP “Cookies”>
   <Server-Side Databases Destination="1;1223;0;1.00076;0;0.594104;0;0;1;0" Open="false"/>
   <Extensions to the CGI Model Destination="1;1224;0;1.00076;0;0.300831;0;0;1;0" Open="false"/>
   <Combining Techniques Destination="1;1225;0;1.00076;0;0.137566;0;0;1;0" Open="false"/>
  </Saving State Information in CGI Scripts>
  <The Hello World Selector Destination="1;1225;0;1.00076;0;0.477702;0;0;1;0" Open="false">
   <Checking for Missing and Invalid Inputs Destination="1;1232;0;1.00076;0;0.482237;0;0;1;0" Open="false"/>
  </The Hello World Selector>
  <Refactoring Code for Maintainability Destination="1;1234;0;1.00076;0;0.560847;0;0;1;0" Open="false">
   <Step 1: Sharing Objects Between Pages—A New Input Form Destination="1;1235;0;1.00076;0;0.557823;0;0;1;0" Open="false"/>
   <Step 2: A Reusable Form Mock-Up Utility Destination="1;1238;0;1.00076;0;0.745276;0;0;1;0" Open="false"/>
   <Step 3: Putting It All Together—A New Reply Script Destination="1;1241;0;1.00076;0;0.482237;0;0;1;0" Open="false"/>
  </Refactoring Code for Maintainability>
  <More on HTML and URL Escapes Destination="1;1243;0;1.00076;0;0.793651;0;0;1;0" Open="false">
   <URL Escape Code Conventions Destination="1;1244;0;1.00076;0;0.553288;0;0;1;0" Open="false"/>
   <Python HTML and URL Escape Tools Destination="1;1245;0;1.00076;0;0.155707;0;0;1;0" Open="false"/>
   <Escaping HTML Code Destination="1;1245;0;1.00076;0;0.772487;0;0;1;0" Open="false"/>
   <Escaping URLs Destination="1;1246;0;1.00076;0;0.603175;0;0;1;0" Open="false"/>
   <Escaping URLs Embedded in HTML Code Destination="1;1247;0;1.00076;0;0.739229;0;0;1;0" Open="false">
    <HTML and URL conflicts: & Destination="1;1248;0;1.00076;0;0.3613;0;0;1;0" Open="false"/>
    <Avoiding conflicts Destination="1;1249;0;1.00076;0;0.20257;0;0;1;0" Open="false"/>
   </Escaping URLs Embedded in HTML Code>
  </More on HTML and URL Escapes>
  <Transferring Files to Clients and Servers Destination="1;1251;0;1.00076;0;0.551776;0;0;1;0" Open="false">
   <Displaying Arbitrary Server Files on the Client Destination="1;1253;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Handling private files and errors Destination="1;1257;0;1.00076;0;0.155707;0;0;1;0" Open="false"/>
   </Displaying Arbitrary Server Files on the Client>
   <Uploading Client Files to the Server Destination="1;1260;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Handling client path formats Destination="1;1266;0;1.00076;0;0.453515;0;0;1;0" Open="false"/>
   </Uploading Client Files to the Server>
   <More Than One Way to Push Bits over the Net Destination="1;1269;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  </Transferring Files to Clients and Servers>
 </Chapter 15. Server-Side Scripting>
 <Chapter 16. The PyMailCGI Server Destination="1;1271;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Things to Do When Visiting Chicago” Destination="1;1271;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
  <The PyMailCGI Website Destination="1;1272;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <Implementation Overview Destination="1;1272;0;1.00076;0;0.385488;0;0;1;0" Open="false"/>
   <New in This Fourth Edition (Version 3.0) Destination="1;1275;0;1.00076;0;0.219199;0;0;1;0" Open="false"/>
   <New in the Prior Edition (Version 2.0) Destination="1;1277;0;1.00076;0;0.1678;0;0;1;0" Open="false"/>
   <Presentation Overview Destination="1;1278;0;1.00076;0;0.429327;0;0;1;0" Open="false"/>
   <Running This Chapter’s Examples Destination="1;1279;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
  </The PyMailCGI Website>
  <The Root Page Destination="1;1281;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <Configuring PyMailCGI Destination="1;1282;0;1.00076;0;0.758881;0;0;1;0" Open="false"/>
  </The Root Page>
  <Sending Mail by SMTP Destination="1;1283;0;1.00076;0;0.75737;0;0;1;0" Open="false">
   <The Message Composition Page Destination="1;1284;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
   <The Send Mail Script Destination="1;1284;0;1.00076;0;0.719577;0;0;1;0" Open="false"/>
   <Error Pages Destination="1;1288;0;1.00076;0;0.453515;0;0;1;0" Open="false"/>
   <Common Look-and-Feel Destination="1;1288;0;1.00076;0;0.681784;0;0;1;0" Open="false"/>
   <Using the Send Mail Script Outside a Browser Destination="1;1289;0;1.00076;0;0.631897;0;0;1;0" Open="false"/>
  </Sending Mail by SMTP>
  <Reading POP Email Destination="1;1291;0;1.00076;0;0.793651;0;0;1;0" Open="false">
   <The POP Password Page Destination="1;1292;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <The Mail Selection List Page Destination="1;1293;0;1.00076;0;0.61678;0;0;1;0" Open="false"/>
   <Passing State Information in URL Link Parameters Destination="1;1296;0;1.00076;0;0.622827;0;0;1;0" Open="false"/>
   <Security Protocols Destination="1;1299;0;1.00076;0;0.553288;0;0;1;0" Open="false">
    <Reading mail with direct URLs Destination="1;1300;0;1.00076;0;0.530612;0;0;1;0" Open="false"/>
   </Security Protocols>
   <The Message View Page Destination="1;1301;0;1.00076;0;0.397581;0;0;1;0" Open="false"/>
   <Passing State Information in HTML Hidden Input Fields Destination="1;1304;0;1.00076;0;0.498866;0;0;1;0" Open="false"/>
   <Escaping Mail Text and Passwords in HTML Destination="1;1306;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  </Reading POP Email>
  <Processing Fetched Mail Destination="1;1308;0;1.00076;0;0.229781;0;0;1;0" Open="false">
   <Reply and Forward Destination="1;1309;0;1.00076;0;0.778534;0;0;1;0" Open="false"/>
   <Delete Destination="1;1310;0;1.00076;0;0.769463;0;0;1;0" Open="false"/>
   <Deletions and POP Message Numbers Destination="1;1314;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Inbox synchronization error potential Destination="1;1314;0;1.00076;0;0.406652;0;0;1;0" Open="false"/>
    <Alternative: Passing header text in hidden input fields (PyMailCGI_2.1) Destination="1;1315;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
    <Alternative: Server-side files for headers Destination="1;1317;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
    <Alternative: Delete on load Destination="1;1317;0;1.00076;0;0.675737;0;0;1;0" Open="false"/>
   </Deletions and POP Message Numbers>
  </Processing Fetched Mail>
  <Utility Modules Destination="1;1318;0;1.00076;0;0.196523;0;0;1;0" Open="false">
   <External Components and Configuration Destination="1;1318;0;1.00076;0;0.386999;0;0;1;0" Open="false"/>
   <POP Mail Interface Destination="1;1319;0;1.00076;0;0.311413;0;0;1;0" Open="false"/>
   <POP Password Encryption Destination="1;1320;0;1.00076;0;0.329554;0;0;1;0" Open="false">
    <Manual data encryption: rotor (defunct) Destination="1;1321;0;1.00076;0;0.353741;0;0;1;0" Open="false"/>
    <Manual data encryption: PyCrypto Destination="1;1322;0;1.00076;0;0.507937;0;0;1;0" Open="false"/>
    <HTTPS: Secure HTTP transmissions Destination="1;1323;0;1.00076;0;0.337113;0;0;1;0" Open="false"/>
    <Secure cookies Destination="1;1324;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <The secret.py module Destination="1;1324;0;1.00076;0;0.217687;0;0;1;0" Open="false"/>
    <Rolling your own encryptor Destination="1;1328;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </POP Password Encryption>
   <Common Utilities Module Destination="1;1328;0;1.00076;0;0.624339;0;0;1;0" Open="false"/>
  </Utility Modules>
  <Web Scripting Trade-Offs Destination="1;1333;0;1.00076;0;0.647014;0;0;1;0" Open="false">
   <PyMailCGI Versus PyMailGUI Destination="1;1334;0;1.00076;0;0.137566;0;0;1;0" Open="false"/>
   <The Web Versus the Desktop Destination="1;1335;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Other Approaches Destination="1;1338;0;1.00076;0;0.191988;0;0;1;0" Open="false"/>
  </Web Scripting Trade-Offs>
 </Chapter 16. The PyMailCGI Server>
</Part IV. Internet Programming>
<Part V. Tools and Techniques Destination="1;1343;0;1.00076;0;0.0786092;0;0;1;0" Open="false">
 <Chapter 17. Databases and Persistence Destination="1;1345;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Give Me an Order of Persistence, but Hold the Pickles” Destination="1;1345;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
  <Persistence Options in Python Destination="1;1345;0;1.00076;0;0.606198;0;0;1;0" Open="false"/>
  <DBM Files Destination="1;1347;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <Using DBM Files Destination="1;1347;0;1.00076;0;0.311413;0;0;1;0" Open="false"/>
   <DBM Details: Files, Portability, and Close Destination="1;1350;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  </DBM Files>
  <Pickled Objects Destination="1;1351;0;1.00076;0;0.39607;0;0;1;0" Open="false">
   <Using Object Pickling Destination="1;1352;0;1.00076;0;0.219199;0;0;1;0" Open="false"/>
   <Pickling in Action Destination="1;1353;0;1.00076;0;0.500378;0;0;1;0" Open="false"/>
   <Pickle Details: Protocols, Binary Modes, and _pickle Destination="1;1356;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  </Pickled Objects>
  <Shelve Files Destination="1;1357;0;1.00076;0;0.25548;0;0;1;0" Open="false">
   <Using Shelves Destination="1;1358;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Storing Built-in Object Types in Shelves Destination="1;1359;0;1.00076;0;0.780045;0;0;1;0" Open="false"/>
   <Storing Class Instances in Shelves Destination="1;1360;0;1.00076;0;0.786092;0;0;1;0" Open="false"/>
   <Changing Classes of Objects Stored in Shelves Destination="1;1362;0;1.00076;0;0.155707;0;0;1;0" Open="false"/>
   <Shelve Constraints Destination="1;1363;0;1.00076;0;0.61678;0;0;1;0" Open="false">
    <Keys must be strings (and str) Destination="1;1363;0;1.00076;0;0.707483;0;0;1;0" Open="false"/>
    <Objects are unique only within a key Destination="1;1364;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
    <Updates must treat shelves as fetch-modify-store mappings Destination="1;1364;0;1.00076;0;0.386999;0;0;1;0" Open="false"/>
    <Concurrent updates are not directly supported Destination="1;1364;0;1.00076;0;0.689342;0;0;1;0" Open="false"/>
    <Underlying DBM format portability Destination="1;1365;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </Shelve Constraints>
   <Pickled Class Constraints Destination="1;1365;0;1.00076;0;0.492819;0;0;1;0" Open="false"/>
   <Other Shelve Limitations Destination="1;1366;0;1.00076;0;0.51096;0;0;1;0" Open="false"/>
  </Shelve Files>
  <The ZODB Object-Oriented Database Destination="1;1367;0;1.00076;0;0.119426;0;0;1;0" Open="false">
   <The Mostly Missing ZODB Tutorial Destination="1;1368;0;1.00076;0;0.571429;0;0;1;0" Open="false"/>
  </The ZODB Object-Oriented Database>
  <SQL Database Interfaces Destination="1;1371;0;1.00076;0;0.219199;0;0;1;0" Open="false">
   <SQL Interface Overview Destination="1;1372;0;1.00076;0;0.474679;0;0;1;0" Open="false"/>
   <An SQL Database API Tutorial with SQLite Destination="1;1374;0;1.00076;0;0.668178;0;0;1;0" Open="false">
    <Getting started Destination="1;1375;0;1.00076;0;0.393046;0;0;1;0" Open="false"/>
    <Making databases and tables Destination="1;1376;0;1.00076;0;0.191988;0;0;1;0" Open="false"/>
    <Adding records Destination="1;1376;0;1.00076;0;0.497354;0;0;1;0" Open="false"/>
    <Running queries Destination="1;1378;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Running updates Destination="1;1380;0;1.00076;0;0.39607;0;0;1;0" Open="false"/>
   </An SQL Database API Tutorial with SQLite>
   <Building Record Dictionaries Destination="1;1381;0;1.00076;0;0.303855;0;0;1;0" Open="false">
    <Using table descriptions Destination="1;1381;0;1.00076;0;0.486772;0;0;1;0" Open="false"/>
    <Record dictionaries construction Destination="1;1382;0;1.00076;0;0.450491;0;0;1;0" Open="false"/>
    <Automating with scripts and modules Destination="1;1383;0;1.00076;0;0.527589;0;0;1;0" Open="false"/>
   </Building Record Dictionaries>
   <Tying the Pieces Together Destination="1;1384;0;1.00076;0;0.715042;0;0;1;0" Open="false"/>
   <Loading Database Tables from Files Destination="1;1386;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Loading with SQL and Python Destination="1;1386;0;1.00076;0;0.169312;0;0;1;0" Open="false"/>
    <Python versus SQL Destination="1;1387;0;1.00076;0;0.622827;0;0;1;0" Open="false"/>
   </Loading Database Tables from Files>
   <SQL Utility Scripts Destination="1;1389;0;1.00076;0;0.500378;0;0;1;0" Open="false">
    <Table load scripts Destination="1;1389;0;1.00076;0;0.78458;0;0;1;0" Open="false"/>
    <Table display script Destination="1;1391;0;1.00076;0;0.273621;0;0;1;0" Open="false"/>
    <Using the scripts Destination="1;1393;0;1.00076;0;0.628874;0;0;1;0" Open="false"/>
   </SQL Utility Scripts>
   <SQL Resources Destination="1;1396;0;1.00076;0;0.155707;0;0;1;0" Open="false"/>
  </SQL Database Interfaces>
  <ORMs: Object Relational Mappers Destination="1;1396;0;1.00076;0;0.539683;0;0;1;0" Open="false"/>
  <PyForm: A Persistent Object Viewer (External) Destination="1;1398;0;1.00076;0;0.173847;0;0;1;0" Open="false"/>
 </Chapter 17. Databases and Persistence>
 <Chapter 18. Data Structures Destination="1;1401;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“Roses Are Red, Violets Are Blue; Lists Are Mutable, and So Is Set Foo” Destination="1;1401;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
  <Implementing Stacks Destination="1;1402;0;1.00076;0;0.219199;0;0;1;0" Open="false">
   <Built-in Options Destination="1;1402;0;1.00076;0;0.60771;0;0;1;0" Open="false"/>
   <A Stack Module Destination="1;1404;0;1.00076;0;0.293273;0;0;1;0" Open="false"/>
   <A Stack Class Destination="1;1406;0;1.00076;0;0.125472;0;0;1;0" Open="false"/>
   <Customization: Performance Monitors Destination="1;1408;0;1.00076;0;0.583522;0;0;1;0" Open="false"/>
   <Optimization: Tuple Tree Stacks Destination="1;1409;0;1.00076;0;0.76644;0;0;1;0" Open="false"/>
   <Optimization: In-Place List Modifications Destination="1;1411;0;1.00076;0;0.647014;0;0;1;0" Open="false"/>
   <Timing the Improvements Destination="1;1413;0;1.00076;0;0.125472;0;0;1;0" Open="false">
    <Results under Python 3.1 Destination="1;1414;0;1.00076;0;0.314437;0;0;1;0" Open="false"/>
    <More on performance analysis Destination="1;1415;0;1.00076;0;0.273621;0;0;1;0" Open="false"/>
   </Timing the Improvements>
  </Implementing Stacks>
  <Implementing Sets Destination="1;1415;0;1.00076;0;0.612245;0;0;1;0" Open="false">
   <Built-in Options Destination="1;1416;0;1.00076;0;0.25548;0;0;1;0" Open="false"/>
   <Set Functions Destination="1;1417;0;1.00076;0;0.538171;0;0;1;0" Open="false">
    <Supporting multiple operands Destination="1;1418;0;1.00076;0;0.452003;0;0;1;0" Open="false"/>
   </Set Functions>
   <Set Classes Destination="1;1419;0;1.00076;0;0.489796;0;0;1;0" Open="false"/>
   <Optimization: Moving Sets to Dictionaries Destination="1;1420;0;1.00076;0;0.699924;0;0;1;0" Open="false">
    <Timing the results under Python 3.1 Destination="1;1423;0;1.00076;0;0.139078;0;0;1;0" Open="false"/>
   </Optimization: Moving Sets to Dictionaries>
   <Adding Relational Algebra to Sets (External) Destination="1;1424;0;1.00076;0;0.329554;0;0;1;0" Open="false"/>
  </Implementing Sets>
  <Subclassing Built-in Types Destination="1;1425;0;1.00076;0;0.279667;0;0;1;0" Open="false"/>
  <Binary Search Trees Destination="1;1427;0;1.00076;0;0.119426;0;0;1;0" Open="false">
   <Built-in Options Destination="1;1427;0;1.00076;0;0.291761;0;0;1;0" Open="false"/>
   <Implementing Binary Trees Destination="1;1428;0;1.00076;0;0.383976;0;0;1;0" Open="false"/>
   <Trees with Both Keys and Values Destination="1;1430;0;1.00076;0;0.612245;0;0;1;0" Open="false"/>
  </Binary Search Trees>
  <Graph Searching Destination="1;1432;0;1.00076;0;0.119426;0;0;1;0" Open="false">
   <Implementing Graph Search Destination="1;1432;0;1.00076;0;0.773998;0;0;1;0" Open="false"/>
   <Moving Graphs to Classes Destination="1;1435;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
  </Graph Searching>
  <Permuting Sequences Destination="1;1437;0;1.00076;0;0.191988;0;0;1;0" Open="false"/>
  <Reversing and Sorting Sequences Destination="1;1439;0;1.00076;0;0.647014;0;0;1;0" Open="false">
   <Implementing Reversals Destination="1;1440;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Implementing Sorts Destination="1;1441;0;1.00076;0;0.430839;0;0;1;0" Open="false">
    <Adding comparison functions Destination="1;1442;0;1.00076;0;0.199546;0;0;1;0" Open="false"/>
   </Implementing Sorts>
   <Data Structures Versus Built-ins: The Conclusion Destination="1;1442;0;1.00076;0;0.792139;0;0;1;0" Open="false"/>
  </Reversing and Sorting Sequences>
  <PyTree: A Generic Tree Object Viewer Destination="1;1444;0;1.00076;0;0.500378;0;0;1;0" Open="false"/>
 </Chapter 18. Data Structures>
 <Chapter 19. Text and Language Destination="1;1447;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“See Jack Hack. Hack, Jack, Hack” Destination="1;1447;0;1.00076;0;0.320484;0;0;1;0" Open="false"/>
  <Strategies for Processing Text in Python Destination="1;1447;0;1.00076;0;0.662132;0;0;1;0" Open="false"/>
  <String Method Utilities Destination="1;1448;0;1.00076;0;0.577475;0;0;1;0" Open="false">
   <Templating with Replacements and Formats Destination="1;1450;0;1.00076;0;0.21164;0;0;1;0" Open="false"/>
   <Parsing with Splits and Joins Destination="1;1451;0;1.00076;0;0.247921;0;0;1;0" Open="false"/>
   <Summing Columns in a File Destination="1;1452;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Summing with zips and comprehensions Destination="1;1453;0;1.00076;0;0.139078;0;0;1;0" Open="false"/>
    <Summing with dictionaries Destination="1;1453;0;1.00076;0;0.699924;0;0;1;0" Open="false"/>
   </Summing Columns in a File>
   <Parsing and Unparsing Rule Strings Destination="1;1454;0;1.00076;0;0.633409;0;0;1;0" Open="false">
    <More on the holmes expert system shell Destination="1;1456;0;1.00076;0;0.429327;0;0;1;0" Open="false"/>
   </Parsing and Unparsing Rule Strings>
  </String Method Utilities>
  <Regular Expression Pattern Matching Destination="1;1457;0;1.00076;0;0.734694;0;0;1;0" Open="false">
   <The re Module Destination="1;1458;0;1.00076;0;0.273621;0;0;1;0" Open="false"/>
   <First Examples Destination="1;1458;0;1.00076;0;0.751323;0;0;1;0" Open="false"/>
   <String Operations Versus Patterns Destination="1;1460;0;1.00076;0;0.536659;0;0;1;0" Open="false"/>
   <Using the re Module Destination="1;1463;0;1.00076;0;0.320484;0;0;1;0" Open="false">
    <Module functions Destination="1;1463;0;1.00076;0;0.46712;0;0;1;0" Open="false"/>
    <Compiled pattern objects Destination="1;1464;0;1.00076;0;0.335601;0;0;1;0" Open="false"/>
    <Match objects Destination="1;1464;0;1.00076;0;0.636432;0;0;1;0" Open="false"/>
    <Regular expression patterns Destination="1;1465;0;1.00076;0;0.340136;0;0;1;0" Open="false"/>
   </Using the re Module>
   <More Pattern Examples Destination="1;1467;0;1.00076;0;0.485261;0;0;1;0" Open="false"/>
   <Scanning C Header Files for Patterns Destination="1;1469;0;1.00076;0;0.677249;0;0;1;0" Open="false"/>
  </Regular Expression Pattern Matching>
  <XML and HTML Parsing Destination="1;1471;0;1.00076;0;0.309902;0;0;1;0" Open="false">
   <XML Parsing in Action Destination="1;1472;0;1.00076;0;0.21164;0;0;1;0" Open="false">
    <Regular expression parsing Destination="1;1473;0;1.00076;0;0.137566;0;0;1;0" Open="false"/>
    <SAX parsing Destination="1;1473;0;1.00076;0;0.730159;0;0;1;0" Open="false"/>
    <DOM parsing Destination="1;1475;0;1.00076;0;0.182918;0;0;1;0" Open="false"/>
    <ElementTree parsing Destination="1;1476;0;1.00076;0;0.154195;0;0;1;0" Open="false"/>
    <Other XML topics Destination="1;1477;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </XML Parsing in Action>
   <HTML Parsing in Action Destination="1;1477;0;1.00076;0;0.619803;0;0;1;0" Open="false">
    <Handling HTML entity references (revisited) Destination="1;1479;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
    <Extracting plain text from HTML (revisited) Destination="1;1480;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   </HTML Parsing in Action>
  </XML and HTML Parsing>
  <Advanced Language Tools Destination="1;1480;0;1.00076;0;0.362812;0;0;1;0" Open="false"/>
  <Custom Language Parsers Destination="1;1482;0;1.00076;0;0.424792;0;0;1;0" Open="false">
   <The Expression Grammar Destination="1;1482;0;1.00076;0;0.715042;0;0;1;0" Open="false"/>
   <The Parser’s Code Destination="1;1483;0;1.00076;0;0.62585;0;0;1;0" Open="false"/>
   <Adding a Parse Tree Interpreter Destination="1;1491;0;1.00076;0;0.154195;0;0;1;0" Open="false"/>
   <Parse Tree Structure Destination="1;1496;0;1.00076;0;0.683296;0;0;1;0" Open="false"/>
   <Exploring Parse Trees with the PyTree GUI Destination="1;1498;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Parsers Versus Python Destination="1;1499;0;1.00076;0;0.25548;0;0;1;0" Open="false"/>
  </Custom Language Parsers>
  <PyCalc: A Calculator Program/Object Destination="1;1499;0;1.00076;0;0.721088;0;0;1;0" Open="false">
   <A Simple Calculator GUI Destination="1;1500;0;1.00076;0;0.137566;0;0;1;0" Open="false">
    <Building the GUI Destination="1;1501;0;1.00076;0;0.498866;0;0;1;0" Open="false"/>
    <Running code strings Destination="1;1502;0;1.00076;0;0.790627;0;0;1;0" Open="false"/>
    <Extending and attaching Destination="1;1503;0;1.00076;0;0.610733;0;0;1;0" Open="false"/>
   </A Simple Calculator GUI>
   <PyCalc—A “Real” Calculator GUI Destination="1;1505;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Running PyCalc Destination="1;1505;0;1.00076;0;0.716553;0;0;1;0" Open="false"/>
    <Evaluating expressions with stacks Destination="1;1507;0;1.00076;0;0.696901;0;0;1;0" Open="false"/>
    <PyCalc source code Destination="1;1511;0;1.00076;0;0.362812;0;0;1;0" Open="false"/>
    <Using PyCalc as a component Destination="1;1517;0;1.00076;0;0.386999;0;0;1;0" Open="false"/>
    <Adding new buttons in new components Destination="1;1519;0;1.00076;0;0.155707;0;0;1;0" Open="false"/>
   </PyCalc—A “Real” Calculator GUI>
  </PyCalc: A Calculator Program/Object>
 </Chapter 19. Text and Language>
 <Chapter 20. Python/C Integration Destination="1;1525;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“I Am Lost at C” Destination="1;1525;0;1.00076;0;0.320484;0;0;1;0" Open="false">
   <Extending and Embedding Destination="1;1526;0;1.00076;0;0.355253;0;0;1;0" Open="false"/>
  </“I Am Lost at C”>
  <Extending Python in C: Overview Destination="1;1528;0;1.00076;0;0.474679;0;0;1;0" Open="false"/>
  <A Simple C Extension Module Destination="1;1529;0;1.00076;0;0.311413;0;0;1;0" Open="false"/>
  <The SWIG Integration Code Generator Destination="1;1533;0;1.00076;0;0.311413;0;0;1;0" Open="false">
   <A Simple SWIG Example Destination="1;1533;0;1.00076;0;0.721088;0;0;1;0" Open="false"/>
  </The SWIG Integration Code Generator>
  <Wrapping C Environment Calls Destination="1;1537;0;1.00076;0;0.657596;0;0;1;0" Open="false">
   <Adding Wrapper Classes to Flat Libraries Destination="1;1541;0;1.00076;0;0.347695;0;0;1;0" Open="false"/>
   <Wrapping C Environment Calls with SWIG Destination="1;1542;0;1.00076;0;0.594104;0;0;1;0" Open="false"/>
  </Wrapping C Environment Calls>
  <Wrapping C++ Classes with SWIG Destination="1;1544;0;1.00076;0;0.305367;0;0;1;0" Open="false">
   <A Simple C++ Extension Class Destination="1;1545;0;1.00076;0;0.21164;0;0;1;0" Open="false"/>
   <Wrapping the C++ Class with SWIG Destination="1;1547;0;1.00076;0;0.500378;0;0;1;0" Open="false"/>
   <Using the C++ Class in Python Destination="1;1549;0;1.00076;0;0.545729;0;0;1;0" Open="false">
    <Using the low-level extension module Destination="1;1550;0;1.00076;0;0.595616;0;0;1;0" Open="false"/>
    <Subclassing the C++ class in Python Destination="1;1551;0;1.00076;0;0.444444;0;0;1;0" Open="false"/>
    <Exploring the wrappers interactively Destination="1;1552;0;1.00076;0;0.60771;0;0;1;0" Open="false"/>
   </Using the C++ Class in Python>
  </Wrapping C++ Classes with SWIG>
  <Other Extending Tools Destination="1;1553;0;1.00076;0;0.773998;0;0;1;0" Open="false"/>
  <Embedding Python in C: Overview Destination="1;1556;0;1.00076;0;0.656085;0;0;1;0" Open="false">
   <The C Embedding API Destination="1;1557;0;1.00076;0;0.21164;0;0;1;0" Open="false"/>
   <What Is Embedded Code? Destination="1;1558;0;1.00076;0;0.489796;0;0;1;0" Open="false"/>
  </Embedding Python in C: Overview>
  <Basic Embedding Techniques Destination="1;1560;0;1.00076;0;0.201058;0;0;1;0" Open="false">
   <Running Simple Code Strings Destination="1;1561;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
    <Compiling and running Destination="1;1561;0;1.00076;0;0.783069;0;0;1;0" Open="false"/>
   </Running Simple Code Strings>
   <Running Code Strings with Results and Namespaces Destination="1;1564;0;1.00076;0;0.480726;0;0;1;0" Open="false"/>
   <Calling Python Objects Destination="1;1566;0;1.00076;0;0.574452;0;0;1;0" Open="false"/>
   <Running Strings in Dictionaries Destination="1;1568;0;1.00076;0;0.25548;0;0;1;0" Open="false"/>
   <Precompiling Strings to Bytecode Destination="1;1570;0;1.00076;0;0.241875;0;0;1;0" Open="false"/>
  </Basic Embedding Techniques>
  <Registering Callback Handler Objects Destination="1;1572;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
   <Registration Implementation Destination="1;1573;0;1.00076;0;0.173847;0;0;1;0" Open="false"/>
  </Registering Callback Handler Objects>
  <Using Python Classes in C Destination="1;1577;0;1.00076;0;0.181406;0;0;1;0" Open="false"/>
  <Other Integration Topics Destination="1;1580;0;1.00076;0;0.380952;0;0;1;0" Open="false"/>
 </Chapter 20. Python/C Integration>
</Part V. Tools and Techniques>
<Part VI. The End Destination="1;1583;0;1.00076;0;0.0786092;0;0;1;0" Open="false">
 <Chapter 21. Conclusion: Python and the Development Cycle Destination="1;1585;0;1.00076;0;0.0816327;0;0;1;0" Open="false">
  <“That’s the End of the Book, Now Here’s the Meaning of Life” Destination="1;1586;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  <“Something’s Wrong with the Way We Program Computers” Destination="1;1586;0;1.00076;0;0.430839;0;0;1;0" Open="false"/>
  <The “Gilligan Factor” Destination="1;1586;0;1.00076;0;0.7226;0;0;1;0" Open="false"/>
  <Doing the Right Thing Destination="1;1587;0;1.00076;0;0.548753;0;0;1;0" Open="false">
   <The Static Language Build Cycle Destination="1;1588;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
   <Artificial Complexities Destination="1;1588;0;1.00076;0;0.365835;0;0;1;0" Open="false"/>
   <One Language Does Not Fit All Destination="1;1588;0;1.00076;0;0.530612;0;0;1;0" Open="false"/>
  </Doing the Right Thing>
  <Enter Python Destination="1;1589;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  <But What About That Bottleneck? Destination="1;1590;0;1.00076;0;0.488284;0;0;1;0" Open="false">
   <Python Provides Immediate Turnaround Destination="1;1591;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
   <Python Is “Executable Pseudocode” Destination="1;1592;0;1.00076;0;0.278156;0;0;1;0" Open="false"/>
   <Python Is OOP Done Right Destination="1;1592;0;1.00076;0;0.662132;0;0;1;0" Open="false"/>
   <Python Fosters Hybrid Applications Destination="1;1593;0;1.00076;0;0.119426;0;0;1;0" Open="false"/>
  </But What About That Bottleneck?>
  <On Sinking the Titanic Destination="1;1594;0;1.00076;0;0.737717;0;0;1;0" Open="false"/>
  <So What’s “Python: The Sequel”? Destination="1;1597;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>
  <In the Final Analysis… Destination="1;1597;0;1.00076;0;0.447468;0;0;1;0" Open="false"/>
 </Chapter 21. Conclusion: Python and the Development Cycle>
</Part VI. The End>
<Index Destination="1;1599;0;1.00076;0;0.0816327;0;0;1;0" Open="false"/>

failed to look up 1;7;0;1.00076;0;0.0816327;0;0;1;0
failed to look up 1;25;0;1.00076;0;0.0816327;0;0;1;0
failed to look up 1;25;0;1.00076;0;0.291761;0;0;1;0
failed to look up 1;26;0;1.00076;0;0.0816327;0;0;1;0
failed to look up 1;26;0;1.00076;0;0.21164;0;0;1;0
failed to look up 1;27;0;1.00076;0;0.0816327;0;0;1;0
failed to look up 1;27;0;1.00076;0;0.588057;0;0;1;0
failed to look up 1;28;0;1.00076;0;0.0816327;0;0;1;0
failed to look up 1;32;0;1.00076;0;0.544218;0;0;1;0
failed to look up 1;33;0;1.00076;0;0.485261;0;0;1;0
failed to look up 1;34;0;1.00076;0;0.0816327;0;0;1;0
failed to look up 1;35;0;1.00076;0;0.0816327;0;0;1;0
failed to look up 1;35;0;1.00076;0;0.643991;0;0;1;0
failed to look up 1;36;0;1.00076;0;0.604686;0;0;1;0
failed to look up 1;36;0;1.00076;0;0.702948;0;0;1;0
failed to look up 1;37;0;1.00076;0;0.489796;0;0;1;0
failed to look up 1;38;0;1.00076;0;0.0816327;0;0;1;0
failed to look up 1;38;0;1.00076;0;0.243386;0;0;1;0
failed to look up 1;38;0;1.00076;0;0.527589;0;0;1;0
failed to look up 1;39;0;1.00076;0;0.145125;0;0;1;0
failed to look up 1;39;0;1.00076;0;0.594104;0;0;1;0
failed to look up 1;43;0;1.00076;0;0.0786092;0;0;1;0
...

Thanks a lot!

Installation help

Hi I've run into trouble installing this. I've put a question on stackoverflow describing what I've tried. Any assistance would be greatly appreciated.

setStyle method on HighlightAnnotation

python -V
Python 3.4.3       

popplerqt4.version()
(0, 24, 0)

popplerqt4.poppler_version()
(0, 30, 0)

Hi all

I cannot figure out how to change the color of an existing HighlightAnnotation. I have a PDF document with existing HighlightAnnotations that I can retrieve for a given page with:

 In [1]: doc = popplerqt4.Poppler.Document.load('doc.pdf')
 In [2]: annotations = doc.page(0).annotations()

which gives me two annotations of type Highlight.

 In [3]: annotations
 Out[3]: 
 [<popplerqt4.HighlightAnnotation at 0x7f4cbc170948>,
  <popplerqt4.HighlightAnnotation at 0x7f4cbc170558>]

Now I can change the author or change the quads with respectively the setAuthor() and setHighlightQuads()methods. This works perfectly and it has the expected behavior when the document is saved (with pdfConverter()).

My question is, given annotations, what is the proper way to change the color of the highlight ? I've seen in a couple of c++ examples that they use annot->style().setColor( RED ); for instance. How can I access the style property of my annotations with python ? In my example I have only access to the attributes below. Thank you in advance for any hints !

In [4]: annot = annotations[0]

In [4]: annot.
annot.ACaret               annot.Dashed               annot.NoEffect             annot.creationDate
annot.AFileAttachment      annot.Delete               annot.None                 annot.flags
annot.AGeom                annot.DenyDelete           annot.Quad                 annot.highlightQuads
annot.AHighlight           annot.DenyPrint            annot.Rejected             annot.highlightType
annot.AInk                 annot.DenyWrite            annot.Reply                annot.modificationDate
annot.ALine                annot.External             annot.RevScope             annot.setAuthor
annot.ALink                annot.FixedRotation        annot.RevType              annot.setBoundary
annot.AMovie               annot.FixedSize            annot.Solid                annot.setContents
annot.ASound               annot.Flag                 annot.Squiggly             annot.setCreationDate
annot.AStamp               annot.Group                annot.StrikeOut            annot.setFlags
annot.AText                annot.Hidden               annot.SubType              annot.setHighlightQuads
annot.A_BASE               annot.Highlight            annot.ToggleHidingOnMouse  annot.setHighlightType
annot.Accepted             annot.HighlightType        annot.Underline            annot.setModificationDate
annot.Beveled              annot.Inset                annot.Unmarked             annot.setUniqueName
annot.Cancelled            annot.LineEffect           annot.author               annot.store
annot.Cloudy               annot.LineStyle            annot.boundary             annot.subType
annot.Completed            annot.Marked               annot.contents             annot.uniqueName

fatal error C1083: Cannot open include file: 'Q MetaType': No such file or directory

When I'm running "python setup.py build" this happens:

running build
running build_ext
building 'popplerqt4' extension
C:\Users\BOGDANOVICH3975\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\Bin\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -IC:\Python27\Lib\site-packages\PyQt4\include -IC:\Python27\include -IC:\Python27\PC -IC:\Qt\4.8.4\include -IC:\Qt\4.8.4\include\QtCore -IC:\Qt\4.8.4\include\QtGui -IC:\Qt\4.8.4\include\QtXml /Tpbuild\temp.win32-2.7\Release\sippopplerqt4cmodule.cpp /Fobuild\temp.win32-2.7\Release\build\temp.win32-2.7\Release\sippopplerqt4cmodule.obj
sippopplerqt4cmodule.cpp
c:\users\bogdanovich3975\desktop\python-poppler-qt4-master\build\temp.win32-2.7\release\sipAPIpopplerqt4.h(13) : fatal error C1083: Cannot open include file: 'QMetaType': No such file or directory
error: command 'C:\Users\BOGDANOVICH3975\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\Bin\cl.exe' failed with exit status 2

What's wrong?

Win10 x64, PyQT4
(same problem Win7 x68)

popplerqt4.version() and popplerqt4.poppler_version() are not available on Mac OS X

Python 2.7.9 (default, Dec 15 2014, 12:01:32) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import popplerqt4
>>> popplerqt4.version()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'version'
>>> popplerqt4.poppler_version()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'poppler_version'
>>> 

build error: ordered comparison between pointer and zero

On macOS High Sierra, building via MacPorts:

:info:build types.sip:30:56: error: ordered comparison between pointer and zero ('PyObject *' (aka '_object *') and 'int')
:info:build         if (obj == NULL || PyList_SET_ITEM (l, i, obj) < 0)
:info:build                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~
:info:build 5 warnings and 1 error generated.
:info:build error: command '/usr/bin/clang' failed with exit status 1

See bug report at MacPorts.

(I cannot confirm this personally, as I haven't got High Sierra yet.)

How to create annotations

Hi,

I'm trying to add an highlightannotation to a document, but I am completely stuck. It is unclear to me how to even create a highlightannotation. If I do

ann = popplerqt4.Poppler.HighlightAnnotation()

I get a type error.

TypeError: popplerqt4.HighlightAnnotation cannot be instantiated or sub-classed

I also can not find the addAnnotation method for a page.

popplerqt4.version()
Out[57]: (0, 24, 0)
In [58]: popplerqt4.poppler_version()
Out[58]: (0, 33, 0)

Build failed.

Build failed.

$ sudo python setup.py build
running build
running build_ext
building 'popplerqt4' extension
gcc -pthread -fno-strict-aliasing -fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DNDEBUG -fmessage-leng
th=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DOPENSSL_LOAD_CONF -fPIC -I/usr/include/poppler/qt4 -I/usr/include/pop
pler -I/usr/include/python2.7 -I/usr/include/python2.7 -I/usr/include -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtXml -c build/temp.linux-x86_64-2.7/sippopplerqt4cmodule.cpp -o b
uild/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/sippopplerqt4cmodule.o
gcc -pthread -fno-strict-aliasing -fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DNDEBUG -fmessage-leng
th=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DOPENSSL_LOAD_CONF -fPIC -I/usr/include/poppler/qt4 -I/usr/include/pop
pler -I/usr/include/python2.7 -I/usr/include/python2.7 -I/usr/include -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtXml -c build/temp.linux-x86_64-2.7/sippopplerqt4QList0101Poppler
FormField.cpp -o build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/sippopplerqt4QList0101PopplerFormField.o
gcc -pthread -fno-strict-aliasing -fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DNDEBUG -fmessage-leng
th=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DOPENSSL_LOAD_CONF -fPIC -I/usr/include/poppler/qt4 -I/usr/include/pop
pler -I/usr/include/python2.7 -I/usr/include/python2.7 -I/usr/include -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtXml -c build/temp.linux-x86_64-2.7/sippopplerqt4QList0101Poppler
Annotation.cpp -o build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/sippopplerqt4QList0101PopplerAnnotation.o
gcc -pthread -fno-strict-aliasing -fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DNDEBUG -fmessage-leng
th=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DOPENSSL_LOAD_CONF -fPIC -I/usr/include/poppler/qt4 -I/usr/include/pop
pler -I/usr/include/python2.7 -I/usr/include/python2.7 -I/usr/include -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtXml -c build/temp.linux-x86_64-2.7/sippopplerqt4QList0101Poppler
Link.cpp -o build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/sippopplerqt4QList0101PopplerLink.o
gcc -pthread -fno-strict-aliasing -fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DNDEBUG -fmessage-leng
th=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DOPENSSL_LOAD_CONF -fPIC -I/usr/include/poppler/qt4 -I/usr/include/pop
pler -I/usr/include/python2.7 -I/usr/include/python2.7 -I/usr/include -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtXml -c build/temp.linux-x86_64-2.7/sippopplerqt4QList0101Poppler
TextBox.cpp -o build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/sippopplerqt4QList0101PopplerTextBox.o
gcc -pthread -fno-strict-aliasing -fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DNDEBUG -fmessage-leng
th=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DOPENSSL_LOAD_CONF -fPIC -I/usr/include/poppler/qt4 -I/usr/include/pop
pler -I/usr/include/python2.7 -I/usr/include/python2.7 -I/usr/include -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtXml -c build/temp.linux-x86_64-2.7/sippopplerqt4QList0101Poppler
EmbeddedFile.cpp -o build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/sippopplerqt4QList0101PopplerEmbeddedFile.o
gcc -pthread -fno-strict-aliasing -fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DNDEBUG -fmessage-leng
th=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DOPENSSL_LOAD_CONF -fPIC -I/usr/include/poppler/qt4 -I/usr/include/pop
pler -I/usr/include/python2.7 -I/usr/include/python2.7 -I/usr/include -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtXml -c build/temp.linux-x86_64-2.7/sippopplerqt4QList0100Poppler
FontInfo.cpp -o build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/sippopplerqt4QList0100PopplerFontInfo.o
gcc -pthread -fno-strict-aliasing -fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DNDEBUG -fmessage-leng
th=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DOPENSSL_LOAD_CONF -fPIC -I/usr/include/poppler/qt4 -I/usr/include/pop
pler -I/usr/include/python2.7 -I/usr/include/python2.7 -I/usr/include -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtXml -c build/temp.linux-x86_64-2.7/sippopplerqt4QList0600QLinked
List0100QPointF.cpp -o build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/sippopplerqt4QList0600QLinkedList0100QPointF.o
gcc -pthread -fno-strict-aliasing -fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DNDEBUG -fmessage-leng
th=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DOPENSSL_LOAD_CONF -fPIC -I/usr/include/poppler/qt4 -I/usr/include/pop
pler -I/usr/include/python2.7 -I/usr/include/python2.7 -I/usr/include -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtXml -c build/temp.linux-x86_64-2.7/sippopplerqt4QList0100Poppler
HighlightAnnotationQuad.cpp -o build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/sippopplerqt4QList0100PopplerHighlightAnnotationQuad.o
gcc -pthread -fno-strict-aliasing -fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DNDEBUG -fmessage-leng
th=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DOPENSSL_LOAD_CONF -fPIC -I/usr/include/poppler/qt4 -I/usr/include/pop
pler -I/usr/include/python2.7 -I/usr/include/python2.7 -I/usr/include -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtXml -c build/temp.linux-x86_64-2.7/sippopplerqt4QLinkedList0100Q
PointF.cpp -o build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/sippopplerqt4QLinkedList0100QPointF.o
gcc -pthread -fno-strict-aliasing -fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DNDEBUG -fmessage-leng
th=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -DOPENSSL_LOAD_CONF -fPIC -I/usr/include/poppler/qt4 -I/usr/include/pop
pler -I/usr/include/python2.7 -I/usr/include/python2.7 -I/usr/include -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtXml -c build/temp.linux-x86_64-2.7/sippopplerqt4PopplerOptConten
tModel.cpp -o build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/sippopplerqt4PopplerOptContentModel.o
build/temp.linux-x86_64-2.7/sippopplerqt4PopplerOptContentModel.cpp:418:1: error: too many initializers for ‘pyqt4ClassTypeDef {aka _pyqt4ClassTypeDef}’
 };
 ^
error: command 'gcc' failed with exit status 1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.