100% found this document useful (8 votes)
26 views

PDF (Ebook) Advanced Guide to Python 3 Programming by Hunt, John ISBN 9783030259426, 9783030259433, 3030259420, 3030259439 download

The document provides information about various eBooks available for download on ebooknice.com, including titles related to Python programming, mathematics, and history. It highlights the 'Advanced Guide to Python 3 Programming' by John Hunt, which is designed for undergraduates and covers topics such as computer graphics, games, and network programming. The book assumes prior knowledge of Python 3 and includes exercises and solutions available online.

Uploaded by

elgarakamlia
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (8 votes)
26 views

PDF (Ebook) Advanced Guide to Python 3 Programming by Hunt, John ISBN 9783030259426, 9783030259433, 3030259420, 3030259439 download

The document provides information about various eBooks available for download on ebooknice.com, including titles related to Python programming, mathematics, and history. It highlights the 'Advanced Guide to Python 3 Programming' by John Hunt, which is designed for undergraduates and covers topics such as computer graphics, games, and network programming. The book assumes prior knowledge of Python 3 and includes exercises and solutions available online.

Uploaded by

elgarakamlia
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 65

Download Full Version ebook - Visit ebooknice.

com

(Ebook) Advanced Guide to Python 3 Programming by


Hunt, John ISBN 9783030259426, 9783030259433,
3030259420, 3030259439

https://ebooknice.com/product/advanced-guide-to-
python-3-programming-21896816

Click the button below to download

DOWLOAD EBOOK

Discover More Ebook - Explore Now at ebooknice.com


Instant digital products (PDF, ePub, MOBI) ready for you
Download now and discover formats that fit your needs...

Start reading on any device today!

(Ebook) Biota Grow 2C gather 2C cook by Loucas, Jason;


Viles, James ISBN 9781459699816, 9781743365571,
9781925268492, 1459699815, 1743365578, 1925268497
https://ebooknice.com/product/biota-grow-2c-gather-2c-cook-6661374

ebooknice.com

(Ebook) Matematik 5000+ Kurs 2c Lärobok by Lena


Alfredsson, Hans Heikne, Sanna Bodemyr ISBN 9789127456600,
9127456609
https://ebooknice.com/product/matematik-5000-kurs-2c-larobok-23848312

ebooknice.com

(Ebook) SAT II Success MATH 1C and 2C 2002 (Peterson's SAT


II Success) by Peterson's ISBN 9780768906677, 0768906679

https://ebooknice.com/product/sat-ii-success-
math-1c-and-2c-2002-peterson-s-sat-ii-success-1722018

ebooknice.com

(Ebook) Advanced Guide to Python 3 Programming, 2nd by


John Hunt ISBN 9783031403354, 3031403355

https://ebooknice.com/product/advanced-guide-to-
python-3-programming-2nd-52673356

ebooknice.com
(Ebook) Master SAT II Math 1c and 2c 4th ed (Arco Master
the SAT Subject Test: Math Levels 1 & 2) by Arco ISBN
9780768923049, 0768923042
https://ebooknice.com/product/master-sat-ii-math-1c-and-2c-4th-ed-
arco-master-the-sat-subject-test-math-levels-1-2-2326094

ebooknice.com

(Ebook) Cambridge IGCSE and O Level History Workbook 2C -


Depth Study: the United States, 1919-41 2nd Edition by
Benjamin Harrison ISBN 9781398375147, 9781398375048,
1398375144, 1398375047
https://ebooknice.com/product/cambridge-igcse-and-o-level-history-
workbook-2c-depth-study-the-united-states-1919-41-2nd-edition-53538044

ebooknice.com

(Ebook) A Beginners Guide to Python 3 Programming 2nd


Edition by John Hunt ISBN 9783031351211, 3031351215

https://ebooknice.com/product/a-beginners-guide-to-
python-3-programming-2nd-edition-51881162

ebooknice.com

(Ebook) Beginner's Guide to Kotlin Programming by John


Hunt ISBN 9783030808921, 3030808920

https://ebooknice.com/product/beginner-s-guide-to-kotlin-
programming-35037852

ebooknice.com

(Ebook) Python Advanced Programming: The Guide to Learn


Python Programming. Reference with Exercises and Samples
About Dynamical Programming, Multithreading,
Multiprocessing, Debugging, Testing and More by Marcus
https://ebooknice.com/product/python-advanced-programming-the-guide-
Richards
to-learn-python-programming-reference-with-exercises-and-samples-
about-dynamical-programming-multithreading-multiprocessing-debugging-
testing-and-more-56236028
ebooknice.com
Undergraduate Topics in Computer Science

John Hunt

Advanced Guide
to Python 3
Programming
Undergraduate Topics in Computer Science

Series Editor
Ian Mackie, University of Sussex, Brighton, UK

Advisory Editors
Samson Abramsky, Department of Computer Science, University of Oxford,
Oxford, UK
Chris Hankin, Department of Computing, Imperial College London, London, UK
Dexter C. Kozen, Department of Computer Science, Cornell University, Ithaca, NY,
USA
Andrew Pitts, University of Cambridge, Cambridge, UK
Hanne Riis Nielson , Department of Applied Mathematics and Computer Science,
Technical University of Denmark, Kongens Lyngby, Denmark
Steven S. Skiena, Department of Computer Science, Stony Brook University,
Stony Brook, NY, USA
Iain Stewart, Department of Computer Science, Science Labs, University of
Durham, Durham, UK
Mike Hinchey, University of Limerick, Limerick, Ireland
‘Undergraduate Topics in Computer Science’ (UTiCS) delivers high-quality
instructional content for undergraduates studying in all areas of computing and
information science. From core foundational and theoretical material to final-year
topics and applications, UTiCS books take a fresh, concise, and modern approach
and are ideal for self-study or for a one- or two-semester course. The texts are all
authored by established experts in their fields, reviewed by an international advisory
board, and contain numerous examples and problems, many of which include fully
worked solutions.
The UTiCS concept relies on high-quality, concise books in softback format, and
generally a maximum of 275–300 pages. For undergraduate textbooks that are
likely to be longer, more expository, Springer continues to offer the highly regarded
Texts in Computer Science series, to which we refer potential authors.

More information about this series at http://www.springer.com/series/7592


John Hunt

Advanced Guide to Python 3


Programming

123
John Hunt
Marshfield
Midmarsh Technology Ltd.
Chippenham, Wiltshire, UK

ISSN 1863-7310 ISSN 2197-1781 (electronic)


Undergraduate Topics in Computer Science
ISBN 978-3-030-25942-6 ISBN 978-3-030-25943-3 (eBook)
https://doi.org/10.1007/978-3-030-25943-3
© Springer Nature Switzerland AG 2019
This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part
of the material is concerned, specifically the rights of translation, reprinting, reuse of illustrations,
recitation, broadcasting, reproduction on microfilms or in any other physical way, and transmission
or information storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar
methodology now known or hereafter developed.
The use of general descriptive names, registered names, trademarks, service marks, etc. in this
publication does not imply, even in the absence of a specific statement, that such names are exempt from
the relevant protective laws and regulations and therefore free for general use.
The publisher, the authors and the editors are safe to assume that the advice and information in this
book are believed to be true and accurate at the date of publication. Neither the publisher nor the
authors or the editors give a warranty, expressed or implied, with respect to the material contained
herein or for any errors or omissions that may have been made. The publisher remains neutral with regard
to jurisdictional claims in published maps and institutional affiliations.

This Springer imprint is published by the registered company Springer Nature Switzerland AG
The registered company address is: Gewerbestrasse 11, 6330 Cham, Switzerland
For Denise, my wife.
Preface

Some of the key aspects of this book are:


1. It assumes knowledge of Python 3 and of concepts such as functions, classes,
protocols, Abstract Base Classes, decorators, iterables, collection types (such as
List and Tuple) etc.
2. However, the book assumes very little knowledge or experience of the topics
presented.
3. The book is divided into eight topic areas; Computer graphics, Games, Testing,
File Input/Output, Database Access, Logging, Concurrency and Parallelism and
Network Programming.
4. Each topic in the book has an introductory chapter followed by chapters that
delve into that topic.
5. The book includes exercises at the end of most chapters.
6. All code examples (and exercise solutions) are provided on line in a GitHub
repository.

Chapter Organisation

Each chapter has a brief introduction, the main body of the chapter, followed by a
list of online references that can be used for further reading.
Following this there is typically an Exercises section that lists one or more
exercises that build on the skills you will have learnt in that chapter.
Sample solutions to the exercises are available in a GitHub repository that
supports this book.

vii
viii Preface

What You Need

You can of course just read this book; however following the examples in this book
will ensure that you get as much as possible out of the content.
For this you will need a computer.
Python is a cross platform programming language and as such you can use Python
on a Windows PC, a Linux Box or an Apple Mac etc. This means that you are not tied
to a particular type of operating system; you can use whatever you have available.
However you will need to install some software on your computer. At a mini-
mum you will need Python. The focus of this book is Python 3 so that is the version
that is assumed for all examples and exercises. As Python is available for a wide
range of platforms from Windows, to Mac OS and Linux; you will need to ensure
that you download the version for your operating system.
Python can be downloaded from the main Python web site which can be found at
http://www.python.org.

You will also need some form of editor in which to write your programs. There
are numerous generic programming editors available for different operating systems
with VIM on Linux, Notepad++ on Windows and Sublime Text on Windows and
Macs being popular choices.
Preface ix

However, using a IDE (Integrated Development Environment) editor such as


PyCharm can make writing and running your programs much easier.
However, this book doesn’t assume any particular editor, IDE or environment
(other than Python 3 itself).

Python Versions

Currently there are two main versions of Python called Python 2 and Python 3.
• Python 2 was launched in October 2000 and has been, and still is, very widely used.
• Python 3 was launched in December 2008 and is a major revision to the lan-
guage that is not backward compatible.
The issues between the two versions can be highlighted by the simple print
facility:
• In Python 2 this is written as print ‘Hello World’
• In Python 3 this is written as print (‘Hello World’)
It may not look like much of a difference but the inclusion of the ‘()’ marks a
major change and means that any code written for one version of Python will
probably not run on the other version. There are tools available, such as the 2to3
utility, that will (partially) automate translation from Python 2 to Python 3 but in
general you are still left with significant work to do.
This then raises the question which version to use?
Although interest in Python 3 is steadily increasing there are many organisations
that are still using Python 2. Choosing which version to use is a constant concern
for many companies.
However, the Python 2 end of life plan was initially announced back in 2015 and
although it has been postponed to 2020 out of concern that a large body of existing
code could not easily be forward-ported to Python 3, it is still living on borrowed
time. Python 3 is the future of the Python language and it is this version that has
introduced many of the new and improved language and library features (that have
admittedly been back ported to Python 2 in many cases). This book is solely
focussed on Python 3.

Useful Python Resources

There are a wide range of resources on the web for Python; we will highlight a few
here that you should bookmark. We will not keep referring to these to avoid
repetition but you can refer back to this section whenever you need to:
• https://en.wikipedia.org/wiki/Python_Software_Foundation Python Software
Foundation.
x Preface

• https://docs.python.org/3/ The main Python 3 documentation site. It contains


tutorials, library references, set up and installation guides as well as Python
how-tos.
• https://docs.python.org/3/library/index.html A list of all the builtin features for
the Python language—this is where you can find online documentation for the
various class and functions that we will be using throughout this book.
• https://pymotw.com/3/ the Python 3 Module of the week site. This site contains
many, many Python modules with short examples and explanations of what the
modules do. A Python module is a library of features that build on and expand
the core Python language. For example, if you are interested in building games
using Python then pygame is a module specifically designed to make this easier.
• https://www.fullstackpython.com/email.html is a monthly newsletter that
focusses on a single Python topic each month, such as a new library or module.
• http://www.pythonweekly.com/ is a free weekly summary of the latest Python
articles, projects, videos and upcoming events.
Each section of the book will provide additional online references relevant to the
topic being discussed.

Conventions

Throughout this book you will find a number of conventions used for text styles.
These text styles distinguish between different kinds of information.
Code words, variable and Python values, used within the main body of the text,
are shown using a Courier font. For example:

This program creates a top level window (the wx.Frame) and gives it a title. It also creates
a label (a wx.StaticText object) to be displayed within the frame.

In the above paragraph wx.Frame and wx.StaticText are classes available in a


Python graphical user interface library.
A block of Python code is set out as shown here:
Preface xi

Note that keywords are shown in bold font.


In some cases something of particular interest may be highlighted with colour:

Any command line or user input is shown in italics and coloured purple; for
example:

Or

Example Code and Sample Solutions

The examples used in this book (along with sample solutions for the exercises at the
end of most chapters) are available in a GitHub repository. GitHub provides a web
interface to Git, as well as a server environment hosting Git.
Git is a version control system typically used to manage source code files (such
as those used to create systems in programming languages such as Python but also
Java, C#, C++, Scala etc.). Systems such as Git are very useful for collaborative
development as they allow multiple people to work on an implementation and to
merge their work together. They also provide a useful historical view of the code
(which also allows developers to roll back changes if modifications prove to be
unsuitable).
If you already have Git installed on your computer then you can clone (obtain a
copy of) the repository locally using:
xii Preface

If you do not have Git then you can obtain a zip file of the examples using

You can of course install Git yourself if you wish. To do this see https://git-scm.
com/downloads. Versions of the Git client for Mac OS, Windows and Linux/Unix
are available here.
However, many IDEs such as PyCharm come with Git support and so offer
another approach to obtaining a Git repository.
For more information on Git see http://git-scm.com/doc. This Git guide provides
a very good primer and is highly recommended.

Acknowledgements I would like to thank Phoebe Hunt for creating the pixel images used for the
StarshipMeteors game in Chap. 8.
Contents

1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Part I Computer Graphics


2 Introduction to Computer Graphics . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 The Graphical Computer Era . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 Interactive and Non Interactive Graphics . . . . . . . . . . . . . . . . 7
2.5 Pixels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.6 Bit Map Versus Vector Graphics . . . . . . . . . . . . . . . . . . . . . . 10
2.7 Buffering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.8 Python and Computer Graphics . . . . . . . . . . . . . . . . . . . . . . . 10
2.9 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.10 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3 Python Turtle Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 The Turtle Graphics Library . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.1 The Turtle Module . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.2 Basic Turtle Graphics . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.3 Drawing Shapes . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2.4 Filling Shapes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.3 Other Graphics Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.4 3D Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.4.1 PyOpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.5 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.6 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

xiii
xiv Contents

4 Computer Generated Art . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23


4.1 Creating Computer Art . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.2 A Computer Art Generator . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.3 Fractals in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.1 The Koch Snowflake . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.2 Mandelbrot Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.4 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.5 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5 Introduction to Matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.2 Matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.3 Plot Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.4 Matplotlib Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.4.1 Backend Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.4.2 The Artist Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.4.3 The Scripting Layer . . . . . . . . . . . . . . . . . . . . . . . . 41
5.5 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6 Graphing with Matplotlib pyplot . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.2 The pyplot API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.3 Line Graphs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.3.1 Coded Format Strings . . . . . . . . . . . . . . . . . . . . . . . 46
6.4 Scatter Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.4.1 When to Use Scatter Graphs . . . . . . . . . . . . . . . . . . 49
6.5 Pie Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.5.1 Expanding Segments . . . . . . . . . . . . . . . . . . . . . . . . 52
6.5.2 When to Use Pie Charts . . . . . . . . . . . . . . . . . . . . . 53
6.6 Bar Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.6.1 Horizontal Bar Charts . . . . . . . . . . . . . . . . . . . . . . . 55
6.6.2 Coloured Bars . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.6.3 Stacked Bar Charts . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.6.4 Grouped Bar Charts . . . . . . . . . . . . . . . . . . . . . . . . 58
6.7 Figures and Subplots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.8 3D Graphs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
7 Graphical User Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
7.2 GUIs and WIMPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Contents xv

7.3 Windowing Frameworks for Python . . . . . . . . . . . . . . . . . . . . 69


7.3.1 Platform-Independent GUI Libraries . . . . . . . . . . . . . 70
7.3.2 Platform-Specific GUI Libraries . . . . . . . . . . . . . . . . 70
7.4 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
8 The wxPython GUI Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
8.1 The wxPython Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
8.1.1 wxPython Modules . . . . . . . . . . . . . . . . . . . . . . . . . 74
8.1.2 Windows as Objects . . . . . . . . . . . . . . . . . . . . . . . . 75
8.1.3 A Simple Example . . . . . . . . . . . . . . . . . . . . . . . . . 75
8.2 The wx.App Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
8.3 Window Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
8.4 Widget/Control Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
8.5 Dialogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
8.6 Arranging Widgets Within a Container . . . . . . . . . . . . . . . . . . 82
8.7 Drawing Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
8.8 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
8.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
8.9.1 Simple GUI Application . . . . . . . . . . . . . . . . . . . . . 86
9 Events in wxPython User Interfaces . . . . . . . . . .. . . . . . . . . . . . . . 87
9.1 Event Handling . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 87
9.2 Event Definitions . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 87
9.3 Types of Events . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 88
9.4 Binding an Event to an Event Handler . . . .. . . . . . . . . . . . . . 89
9.5 Implementing Event Handling . . . . . . . . . .. . . . . . . . . . . . . . 89
9.6 An Interactive wxPython GUI . . . . . . . . . .. . . . . . . . . . . . . . 92
9.7 Online Resources . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 96
9.8 Exercises . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 96
9.8.1 Simple GUI Application . . . . . . .. . . . . . . . . . . . . . 96
9.8.2 GUI Interface to a Tic Tac Toe Game . . . . . . . . . . . 98
10 PyDraw wxPython Example Application . . . . . . . . . . . . . . . . . . . . . 99
10.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
10.2 The PyDraw Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
10.3 The Structure of the Application . . . . . . . . . . . . . . . . . . . . . . 100
10.3.1 Model, View and Controller Architecture . . . . . . . . . 101
10.3.2 PyDraw MVC Architecture . . . . . . . . . . . . . . . . . . . 102
10.3.3 Additional Classes . . . . . . . . . . . . . . . . . . . . . . . . . 103
10.3.4 Object Relationships . . . . . . . . . . . . . . . . . . . . . . . . 104
10.4 The Interactions Between Objects . . . . . . . . . . . . . . . . . . . . . 105
10.4.1 The PyDrawApp . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
10.4.2 The PyDrawFrame Constructor . . . . . . . . . . . . . . . . 106
xvi Contents

10.4.3 Changing the Application Mode . . . . . . . . . . . . . . . 106


10.4.4 Adding a Graphic Object . . . . . . . . . . . . . . . . . . . . 107
10.5 The Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
10.5.1 The PyDrawConstants Class . . . . . . . . . . . . . . . . . . 108
10.5.2 The PyDrawFrame Class . . . . . . . . . . . . . . . . . . . . . 109
10.5.3 The PyDrawMenuBar Class . . . . . . . . . . . . . . . . . . 110
10.5.4 The PyDrawToolBar Class . . . . . . . . . . . . . . . . . . . 111
10.5.5 The PyDrawController Class . . . . . . . . . . . . . . . . . . 111
10.5.6 The DrawingModel Class . . . . . . . . . . . . . . . . . . . . 113
10.5.7 The DrawingPanel Class . . . . . . . . . . . . . . . . . . . . . 113
10.5.8 The DrawingController Class . . . . . . . . . . . . . . . . . . 114
10.5.9 The Figure Class . . . . . . . . . . . . . . . . . . . . . . . . . . 115
10.5.10 The Square Class . . . . . . . . . . . . . . . . . . . . . . . . . . 115
10.5.11 The Circle Class . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
10.5.12 The Line Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
10.5.13 The Text Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
10.6 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
10.7 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

Part II Computer Games


11 Introduction to Games Programming . . . . . . . . . . . . . . . . . . . . . . . 121
11.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
11.2 Games Frameworks and Libraries . . . . . . . . . . . . . . . . . . . . . 121
11.3 Python Games Development . . . . . . . . . . . . . . . . . . . . . . . . . 122
11.4 Using Pygame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
11.5 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
12 Building Games with pygame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
12.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
12.2 The Display Surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
12.3 Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
12.3.1 Event Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
12.3.2 Event Information . . . . . . . . . . . . . . . . . . . . . . . . . . 128
12.3.3 The Event Queue . . . . . . . . . . . . . . . . . . . . . . . . . . 129
12.4 A First pygame Application . . . . . . . . . . . . . . . . . . . . . . . . . . 130
12.5 Further Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
12.6 A More Interactive pygame Application . . . . . . . . . . . . . . . . . 136
12.7 Alternative Approach to Processing Input Devices . . . . . . . . . 138
12.8 pygame Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
12.9 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Contents xvii

13 StarshipMeteors pygame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141


13.1 Creating a Spaceship Game . . . . . . . . . . . . . . . . . . . . . . . . . . 141
13.2 The Main Game Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
13.3 The GameObject Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
13.4 Displaying the Starship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
13.5 Moving the Spaceship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
13.6 Adding a Meteor Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
13.7 Moving the Meteors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
13.8 Identifying a Collision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
13.9 Identifying a Win . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
13.10 Increasing the Number of Meteors . . . . . . . . . . . . . . . . . . . . . 154
13.11 Pausing the Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
13.12 Displaying the Game Over Message . . . . . . . . . . . . . . . . . . . . 156
13.13 The StarshipMeteors Game . . . . . . . . . . . . . . . . . . . . . . . . . . 157
13.14 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
13.15 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

Part III Testing


14 Introduction to Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
14.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
14.2 Types of Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
14.3 What Should Be Tested? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
14.4 Testing Software Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
14.4.1 Unit Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
14.4.2 Integration Testing . . . . . . . . . . . . . . . . . . . . . . . . . 169
14.4.3 System Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
14.4.4 Installation/Upgrade Testing . . . . . . . . . . . . . . . . . . 170
14.4.5 Smoke Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
14.5 Automating Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
14.6 Test Driven Development . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
14.6.1 The TDD Cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
14.6.2 Test Complexity . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
14.6.3 Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
14.7 Design for Testability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
14.7.1 Testability Rules of Thumb . . . . . . . . . . . . . . . . . . . 173
14.8 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
14.9 Book Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
15 PyTest Testing Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
15.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
15.2 What Is PyTest? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
15.3 Setting Up PyTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
15.4 A Simple PyTest Example . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
xviii Contents

15.5 Working with PyTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179


15.6 Parameterised Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
15.7 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
15.8 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
16 Mocking for Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
16.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
16.2 Why Mock? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
16.3 What Is Mocking? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
16.4 Common Mocking Framework Concepts . . . . . . . . . . . . . . . . 191
16.5 Mocking Frameworks for Python . . . . . . . . . . . . . . . . . . . . . . 192
16.6 The unittest.mock Library . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
16.6.1 Mock and Magic Mock Classes . . . . . . . . . . . . . . . . 193
16.6.2 The Patchers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
16.6.3 Mocking Returned Objects . . . . . . . . . . . . . . . . . . . 195
16.6.4 Validating Mocks Have Been Called . . . . . . . . . . . . 196
16.7 Mock and MagicMock Usage . . . . . . . . . . . . . . . . . . . . . . . . 197
16.7.1 Naming Your Mocks . . . . . . . . . . . . . . . . . . . . . . . 197
16.7.2 Mock Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
16.7.3 Attributes on Mock Classes . . . . . . . . . . . . . . . . . . . 198
16.7.4 Mocking Constants . . . . . . . . . . . . . . . . . . . . . . . . . 199
16.7.5 Mocking Properties . . . . . . . . . . . . . . . . . . . . . . . . . 199
16.7.6 Raising Exceptions with Mocks . . . . . . . . . . . . . . . . 199
16.7.7 Applying Patch to Every Test Method . . . . . . . . . . . 200
16.7.8 Using Patch as a Context Manager . . . . . . . . . . . . . 200
16.8 Mock Where You Use It . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
16.9 Patch Order Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
16.10 How Many Mocks? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
16.11 Mocking Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
16.12 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
16.13 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

Part IV File Input/Output


17 Introduction to Files, Paths and IO . . . . . . . . . . . . . . . . . . . . . . . . . 207
17.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
17.2 File Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
17.3 Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
17.4 File Input/Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
17.5 Sequential Access Versus Random Access . . . . . . . . . . . . . . . 213
17.6 Files and I/O in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
17.7 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Contents xix

18 Reading and Writing Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215


18.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
18.2 Obtaining References to Files . . . . . . . . . . . . . . . . . . . . . . . . 215
18.3 Reading Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
18.4 File Contents Iteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
18.5 Writing Data to Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
18.6 Using Files and with Statements . . . . . . . . . . . . . . . . . . . . . . 219
18.7 The Fileinput Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
18.8 Renaming Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
18.9 Deleting Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
18.10 Random Access Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
18.11 Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
18.12 Temporary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
18.13 Working with Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
18.14 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
18.15 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
19 Stream IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
19.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
19.2 What is a Stream? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
19.3 Python Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
19.4 IOBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
19.5 Raw IO/UnBuffered IO Classes . . . . . . . . . . . . . . . . . . . . . . . 234
19.6 Binary IO/Buffered IO Classes . . . . . . . . . . . . . . . . . . . . . . . . 234
19.7 Text Stream Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
19.8 Stream Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
19.9 Closing Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
19.10 Returning to the open() Function . . . . . . . . . . . . . . . . . . . . . . 238
19.11 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
19.12 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
20 Working with CSV Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
20.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
20.2 CSV Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
20.2.1 The CSV Writer Class . . . . . . . . . . . . . . . . . . . . . . 242
20.2.2 The CSV Reader Class . . . . . . . . . . . . . . . . . . . . . . 243
20.2.3 The CSV DictWriter Class . . . . . . . . . . . . . . . . . . . 244
20.2.4 The CSV DictReader Class . . . . . . . . . . . . . . . . . . . 245
20.3 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
20.4 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
21 Working with Excel Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
21.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
21.2 Excel Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
xx Contents

21.3 The Openpyxl. Workbook Class . . . . . . . . . . . . . . . . . . . . . . 250


21.4 The Openpyxl. WorkSheet Objects . . . . . . . . . . . . . . . . . . . . . 250
21.5 Working with Cells . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
21.6 Sample Excel File Creation Application . . . . . . . . . . . . . . . . . 251
21.7 Loading a Workbook from an Excel File . . . . . . . . . . . . . . . . 253
21.8 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
21.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
22 Regular Expressions in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
22.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
22.2 What Are Regular Expressions? . . . . . . . . . . . . . . . . . . . . . . . 257
22.3 Regular Expression Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . 258
22.3.1 Pattern Metacharacters . . . . . . . . . . . . . . . . . . . . . . 259
22.3.2 Special Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . 259
22.3.3 Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
22.4 The Python re Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
22.5 Working with Python Regular Expressions . . . . . . . . . . . . . . . 261
22.5.1 Using Raw Strings . . . . . . . . . . . . . . . . . . . . . . . . . 261
22.5.2 Simple Example . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
22.5.3 The Match Object . . . . . . . . . . . . . . . . . . . . . . . . . . 262
22.5.4 The search() Function . . . . . . . . . . . . . . . . . . . . . . . 263
22.5.5 The match() Function . . . . . . . . . . . . . . . . . . . . . . . 264
22.5.6 The Difference Between Matching and Searching . . . 265
22.5.7 The findall() Function . . . . . . . . . . . . . . . . . . . . . . . 265
22.5.8 The finditer() Function . . . . . . . . . . . . . . . . . . . . . . 266
22.5.9 The split() Function . . . . . . . . . . . . . . . . . . . . . . . . 266
22.5.10 The sub() Function . . . . . . . . . . . . . . . . . . . . . . . . . 267
22.5.11 The compile() Function . . . . . . . . . . . . . . . . . . . . . . 268
22.6 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
22.7 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270

Part V Database Access


23 Introduction to Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
23.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
23.2 What Is a Database? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
23.2.1 Data Relationships . . . . . . . . . . . . . . . . . . . . . . . . . 276
23.2.2 The Database Schema . . . . . . . . . . . . . . . . . . . . . . . 277
23.3 SQL and Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
23.4 Data Manipulation Language . . . . . . . . . . . . . . . . . . . . . . . . . 280
23.5 Transactions in Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
23.6 Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Contents xxi

24 Python DB-API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283


24.1 Accessing a Database from Python . . . . . . . . . . . . . . . . . . . . 283
24.2 The DB-API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
24.2.1 The Connect Function . . . . . . . . . . . . . . . . . . . . . . . 284
24.2.2 The Connection Object . . . . . . . . . . . . . . . . . . . . . . 284
24.2.3 The Cursor Object . . . . . . . . . . . . . . . . . . . . . . . . . 285
24.2.4 Mappings from Database Types to Python Types . . . 286
24.2.5 Generating Errors . . . . . . . . . . . . . . . . . . . . . . . . . . 286
24.2.6 Row Descriptions . . . . . . . . . . . . . . . . . . . . . . . . . . 287
24.3 Transactions in PyMySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
24.4 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
25 PyMySQL Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
25.1 The PyMySQL Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
25.2 Working with the PyMySQL Module . . . . . . . . . . . . . . . . . . . 291
25.2.1 Importing the Module . . . . . . . . . . . . . . . . . . . . . . . 292
25.2.2 Connect to the Database . . . . . . . . . . . . . . . . . . . . . 292
25.2.3 Obtaining the Cursor Object . . . . . . . . . . . . . . . . . . 293
25.2.4 Using the Cursor Object . . . . . . . . . . . . . . . . . . . . . 293
25.2.5 Obtaining Information About the Results . . . . . . . . . 294
25.2.6 Fetching Results . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
25.2.7 Close the Connection . . . . . . . . . . . . . . . . . . . . . . . 295
25.3 Complete PyMySQL Query Example . . . . . . . . . . . . . . . . . . . 295
25.4 Inserting Data to the Database . . . . . . . . . . . . . . . . . . . . . . . . 296
25.5 Updating Data in the Database . . . . . . . . . . . . . . . . . . . . . . . . 298
25.6 Deleting Data in the Database . . . . . . . . . . . . . . . . . . . . . . . . 299
25.7 Creating Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
25.8 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
25.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

Part VI Logging
26 Introduction to Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
26.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
26.2 Why Log? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
26.3 What Is the Purpose of Logging? . . . . . . . . . . . . . . . . . . . . . . 306
26.4 What Should You Log? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
26.5 What Not to Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
26.6 Why Not Just Use Print? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
26.7 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
27 Logging in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
27.1 The Logging Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
27.2 The Logger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
xxii Contents

27.3 Controlling the Amount of Information Logged . . . . . . . . . . . 313


27.4 Logger Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
27.5 Default Logger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
27.6 Module Level Loggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
27.7 Logger Hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
27.8 Formatters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
27.8.1 Formatting Log Messages . . . . . . . . . . . . . . . . . . . . 319
27.8.2 Formatting Log Output . . . . . . . . . . . . . . . . . . . . . . 319
27.9 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
27.10 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
28 Advanced Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
28.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
28.2 Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
28.2.1 Setting the Root Output Handler . . . . . . . . . . . . . . . 325
28.2.2 Programmatically Setting the Handler . . . . . . . . . . . 326
28.2.3 Multiple Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . 328
28.3 Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
28.4 Logger Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
28.5 Performance Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . 333
28.6 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334

Part VII Concurrency and Parallelism


29 Introduction to Concurrency and Parallelism . . . . . . . . . . . . . . . . . 337
29.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
29.2 Concurrency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
29.3 Parallelism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
29.4 Distribution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
29.5 Grid Computing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
29.6 Concurrency and Synchronisation . . . . . . . . . . . . . . . . . . . . . 342
29.7 Object Orientation and Concurrency . . . . . . . . . . . . . . . . . . . . 342
29.8 Threads V Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
29.9 Some Terminology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
29.10 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
30 Threading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
30.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
30.2 Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
30.3 Thread States . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
30.4 Creating a Thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
30.5 Instantiating the Thread Class . . . . . . . . . . . . . . . . . . . . . . . . 349
30.6 The Thread Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Contents xxiii

30.7 The Threading Module Functions . . . . . . . . . . . . . . . . . . . . . . 352


30.8 Passing Arguments to a Thread . . . . . . . . . . . . . . . . . . . . . . . 352
30.9 Extending the Thread Class . . . . . . . . . . . . . . . . . . . . . . . . . . 354
30.10 Daemon Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
30.11 Naming Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
30.12 Thread Local Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
30.13 Timers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
30.14 The Global Interpreter Lock . . . . . . . . . . . . . . . . . . . . . . . . . . 359
30.15 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
30.16 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
31 Multiprocessing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
31.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
31.2 The Process Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
31.3 Working with the Process Class . . . . . . . . . . . . . . . . . . . . . . . 365
31.4 Alternative Ways to Start a Process . . . . . . . . . . . . . . . . . . . . 366
31.5 Using a Pool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
31.6 Exchanging Data Between Processes . . . . . . . . . . . . . . . . . . . 372
31.7 Sharing State Between Processes . . . . . . . . . . . . . . . . . . . . . . 374
31.7.1 Process Shared Memory . . . . . . . . . . . . . . . . . . . . . 374
31.8 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
31.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
32 Inter Thread/Process Synchronisation . . . . . . . . . . . . . . . . . . . . . . . 377
32.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
32.2 Using a Barrier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
32.3 Event Signalling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
32.4 Synchronising Concurrent Code . . . . . . . . . . . . . . . . . . . . . . . 382
32.5 Python Locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
32.6 Python Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
32.7 Python Semaphores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
32.8 The Concurrent Queue Class . . . . . . . . . . . . . . . . . . . . . . . . . 389
32.9 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
32.10 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
33 Futures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
33.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
33.2 The Need for a Future . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
33.3 Futures in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
33.3.1 Future Creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
33.3.2 Simple Example Future . . . . . . . . . . . . . . . . . . . . . . 397
33.4 Running Multiple Futures . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
33.4.1 Waiting for All Futures to Complete . . . . . . . . . . . . 400
33.4.2 Processing Results as Completed . . . . . . . . . . . . . . . 402
xxiv Contents

33.5 Processing Future Results Using a Callback . . . . . . . . . . . . . . 403


33.6 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
33.7 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
34 Concurrency with AsyncIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
34.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
34.2 Asynchronous IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
34.3 Async IO Event Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
34.4 The Async and Await Keywords . . . . . . . . . . . . . . . . . . . . . . 409
34.4.1 Using Async and Await . . . . . . . . . . . . . . . . . . . . . 409
34.5 Async IO Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
34.6 Running Multiple Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
34.6.1 Collating Results from Multiple Tasks . . . . . . . . . . . 414
34.6.2 Handling Task Results as They Are Made
Available . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
34.7 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
34.8 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417

Part VIII Reactive Programming


35 Reactive Programming Introduction . . . . . . . . . . . . . . . . . . . . . . . . 421
35.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
35.2 What Is a Reactive Application? . . . . . . . . . . . . . . . . . . . . . . 421
35.3 The ReactiveX Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
35.4 The Observer Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
35.5 Hot and Cold Observables . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
35.5.1 Cold Observables . . . . . . . . . . . . . . . . . . . . . . . . . . 424
35.5.2 Hot Observables . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
35.5.3 Implications of Hot and Cold Observables . . . . . . . . 424
35.6 Differences Between Event Driven Programming and
Reactive Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
35.7 Advantages of Reactive Programming . . . . . . . . . . . . . . . . . . 425
35.8 Disadvantages of Reactive Programming . . . . . . . . . . . . . . . . 426
35.9 The RxPy Reactive Programming Framework . . . . . . . . . . . . . 426
35.10 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
35.11 Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
36 RxPy Observables, Observers and Subjects . . . . . . . . . . . . . . . . . . 429
36.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
36.2 Observables in RxPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
36.3 Observers in RxPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
36.4 Multiple Subscribers/Observers . . . . . . . . . . . . . . . . . . . . . . . 432
36.5 Subjects in RxPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Contents xxv

36.6 Observer Concurrency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435


36.6.1 Available Schedulers . . . . . . . . . . . . . . . . . . . . . . . . 437
36.7 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
36.8 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
37 RxPy Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
37.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
37.2 Reactive Programming Operators . . . . . . . . . . . . . . . . . . . . . . 439
37.3 Piping Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
37.4 Creational Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
37.5 Transformational Operators . . . . . . . . . . . . . . . . . . . . . . . . . . 441
37.6 Combinatorial Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
37.7 Filtering Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
37.8 Mathematical Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
37.9 Chaining Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
37.10 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
37.11 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448

Part IX Network Programming


38 Introduction to Sockets and Web Services . . . . . . . . . . . . . . . . . . . 451
38.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
38.2 Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
38.3 Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
38.4 Addressing Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
38.5 Localhost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
38.6 Port Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
38.7 IPv4 Versus IPv6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
38.8 Sockets and Web Services in Python . . . . . . . . . . . . . . . . . . . 455
38.9 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
39 Sockets in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
39.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
39.2 Socket to Socket Communication . . . . . . . . . . . . . . . . . . . . . . 457
39.3 Setting Up a Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
39.4 An Example Client Server Application . . . . . . . . . . . . . . . . . . 458
39.4.1 The System Structure . . . . . . . . . . . . . . . . . . . . . . . 458
39.4.2 Implementing the Server Application . . . . . . . . . . . . 459
39.5 Socket Types and Domains . . . . . . . . . . . . . . . . . . . . . . . . . . 461
39.6 Implementing the Client Application . . . . . . . . . . . . . . . . . . . 461
39.7 The Socketserver Module . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
39.8 HTTP Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
39.9 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
39.10 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
xxvi Contents

40 Web Services in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471


40.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
40.2 RESTful Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
40.3 A RESTful API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
40.4 Python Web Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
40.5 Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
40.6 Hello World in Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
40.6.1 Using JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
40.6.2 Implementing a Flask Web Service . . . . . . . . . . . . . 475
40.6.3 A Simple Service . . . . . . . . . . . . . . . . . . . . . . . . . . 475
40.6.4 Providing Routing Information . . . . . . . . . . . . . . . . 476
40.6.5 Running the Service . . . . . . . . . . . . . . . . . . . . . . . . 477
40.6.6 Invoking the Service . . . . . . . . . . . . . . . . . . . . . . . . 478
40.6.7 The Final Solution . . . . . . . . . . . . . . . . . . . . . . . . . 479
40.7 Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
41 Bookshop Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
41.1 Building a Flask Bookshop Service . . . . . . . . . . . . . . . . . . . . 481
41.2 The Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
41.3 The Domain Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
41.4 Encoding Books Into JSON . . . . . . . . . . . . . . . . . . . . . . . . . . 484
41.5 Setting Up the GET Services . . . . . . . . . . . . . . . . . . . . . . . . . 486
41.6 Deleting a Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
41.7 Adding a New Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
41.8 Updating a Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
41.9 What Happens if We Get It Wrong? . . . . . . . . . . . . . . . . . . . 492
41.10 Bookshop Services Listing . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
41.11 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Chapter 1
Introduction

1.1 Introduction

I have heard many people over the years say that Python is an easy language to lean
and that Python is also a simple language.
To some extent both of these statements are true; but only to some extent.
While the core of the Python language is easy to lean and relatively simple (in
part thanks to its consistency); the sheer richness of the language constructs and
flexibility available can be overwhelming. In addition the Python environment, its
eco system, the range of libraries available, the often competing options available
etc., can make moving to the next level daunting.
Once you have learned the core elements of the language such as how classes
and inheritance work, how functions work, what are protocols and Abstract Base
Classes etc. Where do you go next?
The aim of this book is to delve into those next steps. The book is organised into
eight different topics:
1. Computer Graphics. The book covers Computer Graphics and Computer
Generated Art in Python as well as Graphical User Interfaces and Graphing/
Charting via MatPlotLib.
2. Games Programming. This topic is covered using the pygame library.
3. Testing and Mocking. Testing is an important aspect of any software devel-
opment; this book introduces testing in general and the PyTest module in detail.
It also considers mocking within testing including what and when to mock.
4. File Input/Output. The book covers text file reading and writing as well as
reading and writing CSV and Excel files. Although not strictly related to file
input, regulator expressions are included in this section as they can be used to
process textual data held in files.
5. Database Access. The book introduces databases and relational database in
particular. It then presents the Python DB-API database access standard and

© Springer Nature Switzerland AG 2019 1


J. Hunt, Advanced Guide to Python 3 Programming,
Undergraduate Topics in Computer Science,
https://doi.org/10.1007/978-3-030-25943-3_1
2 1 Introduction

one implementation of this standard, the PyMySQL module used to access a


MySQL database.
6. Logging. An often missed topic is that of logging. The book therefore intro-
duces logging the need for logging, what to log and what not to log as well as
the Python logging module.
7. Concurrency and Parallelism. The book provides extensive coverage of
concurrency topics including Threads, Processes and inter thread or process
synchronisation. It also presents Futures and AsyncIO.
8. Reactive Programming. This section of the book introduces Reactive
Programming using the PyRx reactive programming library.
9. Network Programming. The book concludes by introducing socket and web
service communications in Python.
Each section is introduced by a chapter providing the background and key
concepts of that topic. Subsequent chapters then cover various aspects of the topic.
For example, the first topic covered is on Computer Graphics. This section has
an introductory chapter on Computer Graphics in general. It then introduces the
Turtle Graphics Python library which can be used to generate a graphical display.
The following chapter considers the subject of Computer Generated Art and uses
the Turtle Graphics library to illustrate these ideas. Thus several examples are
presented that might be considered art. The chapter concludes by presenting the
well known Koch Snowflake and the Mandelbrot Fractal set.
This is followed by a chapter presenting the MatPlotLib library used for gen-
erating 2D and 3D charts and graphs (such as a line chart, bar chart or scatter
graph).
The section concludes with a chapter on Graphical User Interfaces (or GUIs)
using the wxpython library. This chapter explores what we mean by a GUI and
some of the alternatives available in Python for creating a GUI.
Subsequent topics follow a similar pattern.
Each programming or library oriented chapter also includes numerous sample
programs that can be downloaded from the GutHub repository and executed. These
chapters also include one or more end of chapter exercises (with sample solutions
also in the GutHub repository).
The topics within the book can be read mostly independently of each other. This
allows the reader to dip into subject areas as and when required. For example, the
File Input/Output section and the Database Access section can be read indepen-
dently of each other (although in this case assessing both technologies may be
useful in selecting an appropriate approach to adopt for the long term persistent
storage of data in a particular system).
Within each section there are usually dependencies, for example it is necessary
to understand the pygame library from the ‘Building Games with pygame’
introductory chapter, before exploring the worked case study presented by the
chapter on the StarshipMeteors game. Similarly it is necessary to have read the
Threading and Multiprocessing chapters before reading the Inter Thread/Process
Synchronisation chapter.
Part I
Computer Graphics
Exploring the Variety of Random
Documents with Different Content
e engem, hiszen ha még nem szeretne, szeretni fog egyszer. Mert én
mindent megteszek, hogy maga engem szeressen. Még gazdaggá is
teszem… mert maga gazdag akar lenni. Csak hagyjon fel azokkal a
gondolatokkal, hogy elhágy minket, engem…
A leányok mindig higgadtabbak, mint a férfiak. Bizonyos
perczekben hamarébb nyerik vissza a józanságukat, mint a férfi. Ez
édes perczek mámorító varázsa, a mely a májusi estében
aranyködként borongott fejük körűl: legelsőbben a leányról szállott
el. Ő tudott legelőször megszólalni. És a hangja olyan volt, mint még
soha, zengő és búskomoly.
– Most már nem kell sem a pénz, sem a gazdagság, Gábor…
Csupán azt szeretném, ha az Ibolya-utcza még nagyon messzire
volna. A város másik oldalán volna.
Viczky megszorította a kezében fekvő kezet. Áradozva felelt:
– Ha akarja, egyáltalában eltűnik az Ibolya-utcza a föld szinéről.
Csak magától függ, Rózsa. Én majd megkérem a kezét, a mint
szokás, aztán elvégzem a dolgom a gyámapámmal – és nincs, többé
nincs Ibolya-utcza. Sőt megigérek magának még valamit. Hogy soha
nélkülözést ne szenvedjünk, megkeresem azt a legendabeli zöld
erszényt, a melybe az apám a vagyonát rejtette. Annak meg kell
lenni valahol és bizonyos, hogy én megtalálom. Én jól ismertem az
apám szokásait, bolondságait. Eddig nem jutott eszembe keresni az
erszényt. Szinte féltem tőle, ha megtalálom. Babonás, gyermekesen
naiv hittel azt képzeltem néha, hogy valami átok fűződik a bűvös
erszényhez, a mely átok rajtam is megfoganna, ha kezembe jutna az
erszény. Most már látom, hogy ez a hit ostobaság volt. Az erszényt
megkeresem, mert szükségünk lesz reá.
Rózsa hirtelen megállott és a Viczky szemébe nézett. Kezét
karjára tette és mozdulatlan arczán félelem tükröződött.
– Gábor, igérjen meg nekem valamit. Most, ebben a szent, soha
vissza nem térő, boldog pillanatban!
Viczky esküvésre emelte a kezét, de Rózsa gyöngéden lenyomta
a karját.
– Ne esküdjön; elég, ha megigéri. Igérje meg nekem azt, –
mondta csöndes, meggondolt hangon a leány, – hogy a bűvös
erszényt sohasem fogja keresni. Soha-soha egyetlen lépést nem
tesz, hogy az erszényt megtalálja.
Viczky meglepetten nézett a leányra.
– Nem értem, – mormogta. – Az előbb másképen szólott, Rózsa.
Rózsa elpirúlt és a kezét a Viczky nyaka köré csúsztatta:
– Igérd meg, Gábor… Én babonás vagyok, mindig nagyon
babonás voltam. Valami azt súgja nekem, hogy az az erszény nagy,
igen nagy szerencsétlenséget rejt magában.
– Vagyon van benne, – felelt nevetve Viczky. – Vagyon, a melyre
maga vágyakozik.
A leány összekulcsolta a kezét.
– Kérlek, Gábor… Nekem nem kell semmi. Csupán az elkeseredés
beszélt belőlem. Hadd a legendákat, hadd födje be őket a por. A
legendák nem mondanak igazat. Abban az erszényben nem kincs
van, hanem átok, a mely üldözte az atyádat és üldözőbe vesz
tégedet is. Hagyd pihenni a legendákat…
Szinte fátumszerűen hangzottak a leány szavai a csendes
estében. Látnoki tekintettel nézett a Viczky arczába és két kezét
óvólag emelte fel.
Viczky megnyugtatni próbálta:
– Ne beszéljünk most az erszényről, Rózsa… Nem olyan könnyű
dolog azt megtalálni, sokan kereshették azt már az apám halála óta.
– Ne keressed az erszényt! – ismételte a leány.
Már csaknem sötétség vette őket körűl. A nap letűnt a távoli
kertek mögött és egy helyen a jegenyék ijesztő árnyakat vetettek a
földre. A palánk olyan sötét és félelmetes volt mellettük, mintha a
temető kerítése volna. Csak messze, messze pislogott egy lámpa, a
melyet az esti párák lebegtek körűl. Megfogták egymás kezét és
sietve mentek tovább.
A sötétben megszólalt a Marietta hangja, a ki észrevétlenűl jó
messzire elhagyta őket:
– Hol jártatok, gyerekek? – kérdezte. – A hol az a lámpás van, ott
kezdődik a mi utczánk. Szegény Janka! – tette hozzá sóhajtva. –
Belebetegszik az izgatottságba.
Legnagyobb csodálkozására az ijesztgetésekre sem a leány, sem
Viczky nem válaszolt. Jókedvűen mentek egymás mellett és lóbázták
a kezüket, mint a vasárnapi kirándulók. Rózsa, a ki úgy tudott
fütyülni, mint egy juhász, egy indulót fütyült, a melyet a
versenytéren játszott a katonabanda. A füttyszó mellett értek hazáig.
A kapuban csakugyan várta őket valaki, de nem Janka, hanem az
öreg Fátyol Kázmér. Az öregúr húsz esztendő óta nem volt ilyen
tájban odahaza, valami nagy dolognak kellett történni, hogy mellőzte
a külvárosi asztaltársaságokat. Bojtos házisapka volt a fején és a
kezében hosszúszárú pipa, mintha saját falusi kuriája előtt
álldogálna.
– Servus humillimus! – kiáltott fel szokatlan élénkséggel és
megemelte bojtos sapkáját. – Van szerencsém üdvözölni Viczkó és a
hozzátartozók urát és fejedelmét. Adja az ég kegyelme…
– Kérlek, atyus! – vágott közbe türelmetlenűl Marietta. – Mondd
el gyorsan. Megtalálták tán az erszényt?
Az öreg Fátyol megzavarodva meredt maga elé, mint mindig, ha
rendes kerékvágásából kizökkentették.
– Az erszényt? – motyogta. – Azt valóban meg kellene találni.
Magam is azt hittem, hogy megvan, a mikor délután a sürgönyt
hozták. Húsz éve nem láttam sürgönyt…
– Miféle sürgönyről beszél, Kázmér bácsi? – kérdezte Viczky.
Az öregúr megzavarodva kotorászott a zsebében:
– Bocsáss meg, fiam. Nem tudtam ellentállani és felbontottam.
Bocsáss meg öreg bátyádnak. Csupán csak az van benne, hogy
Baracskay, a vén gazember gyámapád haldoklik. Menj hozzá sietve.
Viczky megszorította a Rózsa kezét és vigan felkiáltott:
– Jó szelet kaptunk. Föl a vitorlákkal!
Aztán Rózsát hirtelen mozdulattal atyja elé vezette és gyors
elhatározással megszólalt:
– Kedves bátyám, most már körülbelől nagykorú leszek,
szabadon rendelkezhetem akaratommal. Van szerencsém megkérni a
Rózsa kisasszony kezét.
A míg Marietta szinte kővé meredt a meglepetéstől, az öreg
Fátyol Kázmér cseppet sem látszott csodálkozni a hirtelen
leánykérésen. A házisapkáját jókedvűen vágta félre a fején és isteni
derűltséggel csapott a Viczky vállára:
– Helyes, öcsém… Rendben van a dolog. Tudtam, hogy az lesz a
vége, elveszed valamelyik leányomat. Ha Rózsa a választottad, légy
boldog Rózsával, – így szólt az öreg és a külvárosi bérház kapujában
kedélyesen áldását adta a jegyespárra.
Ezen az estén Jankának csak lefekvés előtt jutott eszébe
kérdezősködni a lóverseny-játék eredményéről és csöppet sem
látszott boldogtalannak a balsiker miatt. Igen boldogok voltak
mindnyájan, csak Marietta könnyezett csendesen. De csakhamar
letörölte könnyeit és kedves, izgató ábrándozásokat folytatott arról,
hogy milyen is legyen a Rózsa menyasszonyi ruhája. Janka egész
éjjel számolt, kalkulált és egy régi szakácskönyvet lapozgatott. S
még álmában is az esküvői ebéd fogásaival foglalkozott.
Hajnalban Viczky útrakészen megállott az egyik udvari ablak
előtt, a melyet szűziesen takart el a zsenillia-függöny. Gyönyörű
májusi hajnal volt. A külvárosi udvar sovány akáczfái szinte
kinyújtózkodtak a felkelő nap felé, mint hálaadó kezek. A házfödél
ragyogott piros-rózsaszinben és az égen felébredtek a május hófehér
bárányfelhői, a melyek mint kedves reggeli álmok úsztak tova a
messzeségbe. Viczky halkan megkopogtatta az ablakot.
A zsenillia-függöny nyomban megmozdult. A ki a függöny mögött
volt, az már régen, felöltözve várta ezt a kopogtatást.
Rózsa kinyitotta az ablakot és félretolta a mályvás cserepeket.
Sokáig szótlanúl néztek egymásra, sohasem érzett boldogsággal és
szerelemmel. Egymásba kapcsolódott a tekintetük és nem tudtak
szólni. Boldogok, nagyon boldogok voltak.
– Édes vőlegényem, – susogta Rózsa és a homlokát kinyújtotta a
mályvák között.
– Édes menyasszonyom!
Viczky egy szűzies, boldog csókot lehelt arra a nemes, tiszta
homlokra, aztán még sokáig, nagyon sokáig nézték egymást, mintha
minden vonásukat, arczuknak legparányibb részecskéjét
emlékezetükbe akarták volna vésni, mint a kik nagyon hosszú időre
bucsút mondanak egymásnak.
Rózsa csendesen visszahúzódott.
– Maradj még! – szólt Viczky.
És a leány maradt és tovább nézték egymást ifjúságuknak első,
boldog, fenséges szerelmében, mintha csak érezték volna, hogy
sokáig, nagyon sokáig nem fogják egymást így látni.
– Isten veled! – mondta Rózsa és bezárta az ablakot.
Viczky végigment az udvaron és az udvar közepén csaknem
belebotlott egy nagy fekete kakasba, a melyet idáig sohasem látott a
házban.
– Nini, az apám fekete kakasa! – kiáltott fel önkéntelenűl.
Úgy érezte, hogy a hideg fut a hátán keresztül. Mire körülnézett,
a nagy fekete kakas már nyomtalanúl eltünt.
Megfordult és az ablaknál megpillantotta Rózsát, a mint
elmerengve kisérte tekintetével a távozót.
– Látta a fekete kakast? – kiáltott fel Viczky elsápadva.
Rózsa tagadólag rázta a fejét. És Viczky Gábor lehajtott fővel,
baljóslatú gondolatokkal eltelve hagyta el a sárga házat, hol sok
boldog esztendőt töltött.
AZ ERSZÉNY CSALOGAT.
Vitte a vonat Viczky Gábort hazafelé. A kávédarálónak csúfolt
viczinális ott futott el magas töltésén a viczkói ősi birtok mellett.
Gábor megpillantotta a jegenyéket, a melyek már az ő
gyermekségében is nagy fák voltak, de most mintha még nagyobbak
lettek volna. A jegenyék mögött látta az ősi házat, a melyet
zsindelylyel födöttnek hivtak, pedig csak eresze volt zsindelyből, a
házfödél maga becsületes nád volt. A kúrián túl pedig ott emelkedett
az az ormótlan nagy disznóól, a hová létrán vitték volna fel a
sertéseket, ha a Baracskay bácsi gazdasági tervei megvalósulnak. Az
öregúr ugyanis nagyszabású sertéshizlalást akart kezdeni a viczkói
birtokon. De im a halál közbelép és a hízók nem jutnak be a
tiszteletükre épített kastélyba. Egy kanyarodónál megpillantotta a
híres viczkói nádast, a melyről a legenda azt tartotta, hogy Béla
király bujdosott benne a tatárjárás idejében. Az egész környéken
seholsem volt már nádas, csupán Viczkón. A híres tiszai nádasok
eltűntek. Az unokáknak mindig több és több szükségük van a földre,
kiszárítják a vadvizeket, kiirtják az ingoványokat. De a viczkói nádas
még mindig a maga ősi szépségében terűlt el a vasúti töltés mellett.
A míg a vonat kattogva futott tova, a beláthatlan nádas tavaszi
pompájában rengett, hajladozott a szélben.
A szél néhol viharmadárként csapott bele a nádak közé és ott
kivillant egy-egy vakítóan ragyogó zöld tavacska, mint valami
drágakő a napsugárban. A nádas felett, a vonat zörgésétől
megriadva, mint valami másvilági fehér lélek, lassú szárnyalással
repűlt tova egy kócsagmadár.
Viczky Gábornak megdobbant a szive, a mikor a ritka szárnyast
megpillantotta:
– Kócsag sincs már máshol, csak Viczkón, – gondolta hirtelen
támadó büszkeséggel.
Lenn a ragyogó zöld tavacskák, fenn a hófehér madár, közbűl a
rengő, virágzó nádasrengeteg, míg igen nagy távolságban, mint
valami túlvilági kép, a Tisza ezüstszalagja húzódott, kanyargott: ez
volt a Viczkyek ősi birtoka.
És a nádas közepén, ott, a hol most a kócsag repült épen, egy
zöld halom emelkedett ki a nádas egyeneséből. Ez a vezérhalom, a
melyről azt tartották, hogy honfoglaló ősök pihentek rajta, volt a
Viczkyek temetkező helye. A vezérhalom mélyében hajdanában ősi
czölöp-sírt fedeztek fel a Viczkyek. A czölöp-sírban pihenő pogányt
szépen kilakoltatták a halomból és azontúl maguk temetkeztek az
ezeresztendős sírboltba. Ilyen sírboltja se igen volt másnak
Magyarországon, csak a Viczkyeknek.
A Gábor szivét szokatlan büszkeség dagasztotta, a míg a vonat az
ősi birtokon robogott keresztül. Esterházy két óra hosszat a maga
földjén jár a gyorsvonaton, de talán ő se lehet büszkébb, mint Viczky
Gábor volt, a mikor a viczinális a vezérhalom felé kanyarodott.
Megemelte a kalapját és köszönt az ősöknek:
– Jó napot, urak!
Ott fekszik a halom mélyében a nagyszakállú Tóbiás, a ki a
hagyomány szerint olyan goromba ember volt, hogy még József
császárnak is odamondogatott, a mikor a császár sárga nadrágban,
kékgombos zöld kabátban és lovászsapkában ezen a vidéken is
megfordult. Ott van Mátyás, a nagyerejű és Simon, a kinek három
felesége volt. A magyar családok hagyományai fölérnek a görög
mitologiával. Az elmúlt ó-emberek a familiáris szemüvegen át
rendesen félisteni magasságba emelkednek. Legutolsónak a Viczky
Eduárd diófakoporsóját vitték ide a pákászok csónakjaikon, a míg a
ködös estében a régi kálvinista zsoltár hangzott a nádak felett…
Gábornak hirtelen egy gondolat villant meg az agyában. És az a
gondolat lassan bontakozott, növekedett, míg végűl világosan vélte
látni, hogy ha az apja, Viczky Eduárd, elrejtette valahol a bűvös
erszényt, nem rejthette el máshol, csak ezen a helyen, a hol nem jár
más, mint vadmadár. Igen, seholse lehet olyan biztonságban az
erszény, mint ezen a nádvilágbeli szigeten, a melyre nem ad kölcsönt
semmiféle bank, a melynek pénzértékben kifejezhető ára nincs, a
mit tehát a Viczkyektől sohasem vehet el senki. A vezérhalom a
macskának se kell, mert hiszen minek is kéne? A Viczkyek csontja
nem éri meg azt a fáradságot, hogy érte bárki a szigetet felkeresse.
Biztosabb helyre nem rejthette el az apja az erszényt. Ide csak a
halottak szoktak már járni. És a pénzt még egy halott Viczky sem
tudja elkölteni.
A míg a vonat ablakából a vezérhalmot látta Gábor, mindinkább
megerősödött gyanuja. Eszébe jutottak megjegyzések, a melyeket az
apja elejtett; egyszer azt mondta:
– Ha minden elvész, a Viczkyeknek akkor is megmarad eredendő
földjük, a Nyilas. A Nyilas adta nekik az életet. És ha rákerül a sor, a
Nyilas újra kiteszen magáért hűségességében.
Nyilas volt a vezérhalom neve.
Máskor azt mondta:
A Viczkyek titkát soha senki sem fogja megtudni, mert a
vadkacsák nem árulják el.
Viczky Gábor mélyen elgondolkozva érkezett haza. Már
besötétedett, a mikor a vasló köhögve, fáradtan beporoszkált az
állomásra. A legelső ember, a ki útjába kerűlt, nem volt más, mint
Blásik János.
Blásik uram nagyon megváltozott azon esztendők óta, mióta nem
láttuk. A tagbaszakadt, kövér ember lesoványodott, leromlott. Az
ádámcsutkája szokatlanúl kidudorodott gallérjából és sápadt,
vértelen arczában emésztő, lázas tűzben égett beesett szeme. A
ruhája is nagyon fogyatékos volt. Olyanforma ruha volt rajta, a
milyenben a jobbfajta vidéki koldusok szoktak járni. Itt egy ócska
kabátot ajándékoznak neki, amott egy régi kalapot. A saruja felett
vásott macskanadrág feszűlt, a melyre két vármegyében ráismertek,
hogy azt Baracskay bácsi viselte valamikor. Mert, anno, hires volt az
a czitromsárga macskanadrág.
Blásik erőszakkal kezet akart csókolni Gábornak és mert minden
erejét megfeszítette, sikerűlt neki. A szájából erős pálinkaszag dőlt
és a nyelve nehézkesen forgott.
– Nem felejtettük el a mi áldott kis gazdánkat. Már nagyon vártuk
haza. Mit ér az élet Viczky nélkül? A nap se igazi nap, ha nem
Viczkyre süt. Az öreg Baracskay úr az utolsókat rúgja, aztán
beköltözhetünk a kastélyba…
Elkapta a Gábor felöltőjét és ajkához szorítva, könnyes szemmel
lépkedett utána.
– Csakhogy újra látok egy Viczkyt! – sóhajtotta őszinte
meghatottsággal. – Csak egy úr van Magyarországon és az is Viczky.
Az állomás előtt egy hórihorgas, borotvált képű, nagyon rongyos
ember kapta el a Gábor kezét és nagyot csókolt rajta, miközben
csaknem letérdepelt.
– Isten hozta, méltóságos úr.
Gábor hátraugrott, míg Blásik János kedveskedve dörmögé a
válla felett:
– A Bimbó! Nem tetszik emlékezni a Bimbóra? A mi megdicsőült
urunknak udvari költője volt a Bimbó.
Egy sárga homokfutó várt az állomás előtt, a melyet Blásik János
nagy szertartásossággal dirigált előre. Buzgólkodásában észre sem
vette, hogy Bimbó, az imént bemutatott poéta alattomosan
settenkedik Gábor körül és a fülébe suttog. Gábor a zsebébe nyúlt,
de akkorára már ott termett Blásik János és megkapta azt a rongyos
frakkot, a mely Bimbó testét födte.
– Szégyeld magad, pálinkás-hordó! – dörmögte és a frakk egyik
szárnya a kezében maradt.
Az egykori udvari poéta siránkozva, alkoholista csuklással
nyöszörögte:
– Meg fogod fizetni… Meg fogod fizetni a ruhámat!
A homokfutó már régen elindult, Gábor még mindig hallani vélte
a Bimbó hangját:
– Meg fogod fizetni!
A kisvároska olajmécsesei feltünedeztek a távolban és
barátságosan pislogtak Viczky Gábor felé:
– Jó ómen, csupa jó ómen, – gondolta magában Viczky. –
Baracskai bácsi mégsem lopta el az egész hagyatékot.
A kocsi végigdöczögött a rettenetes kisvárosi kövezeten, Blásik a
kocsis mellett ülve, jobbra-balra mutogatott a sötétbe és
magyarázatokkal szolgált:
– A sánta Grosz felhúzatta a házat. Telik a kutyának a
pálinkából!… Emitt meg Fáncsiné, tetszik tudni, az a föstött arczú,
épített új házat. Hej, be szép asszony volt a kutya. Egy pár tégla a
mi vagyonunkból is kerűlt az új házba. Tetszik tudni, megdicsőült
urunk…
Hosszú földszintes ház előtt állottak meg, a mely a sötétben
szinte a földhöz látszott lapulni. A vasrostélyos ablakokon át
gyertyavilág szüremlett ki, odabenn a szobában Baracskay bácsi ült a
pohos zöld kályha előtt és iráscsomókat dobált a tűzbe.
– Az öreg készül a másvilágra, elégeti bűneit, – dörmögte
félhalkkal Blásik, a míg Gábort a kocsiról lesegítette.
A taplósapkás, ősz fejet vöröslő fénynyel világította meg a tűz.
Mintha egy kis darab pokol égett volna ott; egy kis darab pokol, a
mely minden vén fiskális irodájában található; emberi bűnök,
szenvedélyek, roszaságok gyűjteménye. Az öreg Baracskaynak
sohasem volt olyan pöre, a melyben az igazság az ő pártján lett
volna. A kinek igazsága volt, az nem Baracskayt kereste fel.
Sopánkodott is egész életében az öreg azon, hogy neki nagyobb
mesterség egyetlen pörét megnyerni, mint más fiskálisnak tizet. A
bűnbe esett falusi parasztok között közmondásossá vált a veszettnek
látszó pör megnevezése:
– Ez a gólyáé!
Tudniillik a Baracskay uram kapuján a családi czímer függött
csupán – a fiait etető gólyamadár, – és alatta a jelzés: ügyvédi iroda.
A mikor Gábor a szobába lépett, az öreg abbahagyta a tüzelést,
bár nagy garmada poros irás feküdt még előtte a földön. Megrúgta a
papucsa orrával a papirosokat:
– De bolond is vagyok! – kiáltott fel. – Még a másvilágról is
védelmezem a klienseimet, pedig sohasem fizettek meg.
Az öregnek csak szokatlanúl beesett szemén, sárga arczán
látszott, hogy valami hiba van a gépezetben, de egyébként
nyugodtnak és vidámnak látszott. Összeaszott, sárga kezét Gábor
felé nyújtotta:
– No, fráter… Haragszol tán, hogy hiába fárasztottalak.
Biztosítlak, nem jöttél hiába. Meg fogok halni.
A vörös hálóköntöst, a mely legalább is száz esztendősnek
látszott, fázósan szorította testéhez. A kályhában hamvadó
papirosokra mutatott:
– A pöreim még egyszer felmelegítettek utoljára. Hűséges, derék
pörök voltak, el lehetett velük mulatni egy egész életen át. Sok
gazságot, komiszságot, hunczutságot láttam, de a legnagyobb
gazember mégis csak én vagyok, öcsém.
– Nono, Samu bácsi! – mormogta Viczky. – Ne legyünk olyan
szigorúak.
Baracskay bácsi akaratoskodva ütötte fel a fejét:
– De bizony én vagyok a legnagyobb gazember. Már ezt az egyet
nem engedem magamtól elvitatni. Mindjárt igazat adsz nekem,
öcsém, csak egy kicsinykét idefigyelj.
Viczky idegesen nézett körűl a szobában. Jobb szerette volna
elkerülni ezt a jelenetet a gyámapjával. Valahogy azt remélte, hogy
már el is temetik az öreget, mire ő hazaérkezik. És az öreg itt van,
lábait egymásra veti, hátradől a tintaszagú, vén székben és
ravaszkásan hunyorít a szemével:
– Majd mindjárt, – biztatta Viczkyt. – Mindjárt meghallod, milyen
nagy gazember voltam. Mert most már beszélhetek múlt időben.
Reggel mi már aligha találkozunk. Előlről kell kezdeni, – mondta
mesélő hangon, – hogy jól megérthesd a dolgokat. Volt nekem
három pöröm… Azokat nem égettem el, ott vannak abban a ládában,
ott van a te örökséged, fiam; pöriratok alakjában kapod tőlem vissza
édesapád örökségét…
Viczky talpraállott és szédülve nézett az öreg fiskálisra. Az
jókedvűen legyintett kezével:
– Nem kell mindjárt megijedni, fiam, – mondta atyailag. – Fel a
fejjel és bátran a veszélyben! Mikor én ilyen fiatal legény voltam,
mint most te, a hétfejű sárkánytól sem ijedtem meg. Azért mondom,
bátorság.
– Nem értem, Samu bátyám, – mormogta Viczky megzavarodva.
Baracskay felállott és gyöngéden lenyomta Viczkyt a székbe.
– Csak nyugalom, fiam, – szólt és a zsebéből kulcsot keresett elő
és felnyitotta a sarokban álló vaspántos láda zárját. A míg a láda
fedelét felemelte, olyan várakozólag nézett Viczkyre, mintha az
ezeregyéjszaka csodáját mutatná meg neki.
A ládában nagy halomban feküdtek új és ócskaságtól avas iratok.
Baracskay kivette a legfelső iratcsomót és gyönyörködve szemlélte,
mint valamely drágakövet.
– Ez a Tass kontra Tass…
Két kezébe fogta az irást és sóhajtva mondta:
– Ha még egy kis időm volna, az enyém lehetne a Csermely-köz,
ezer hold televényföld, szeszgyártási és dohánytermelési
engedélylyel…
A irást sóhajtva visszahelyezte a ládába és másikat vett elő.
– Birto kontra egri káptalan… Ötven éves. Ha csak valamivel
többet hagyományoz reád édesapád, hogy kitartásom legyen,
elvertem volna a káptalanon a port. De hát bolond volt az öreg. A
vagyonának a nagy részét eldugta. A macska tudná, hová dugta.
Új iráscsomó kerűlt ki a ládából. Szinte ajkához emelte Baracskay
bácsi a papirosköteget, a mint áhítatosan mormogta:
– Ez itt két kerek millió, fiam. Egy kopogó forinttal sem kevesebb.
Bánovszky kontra magyar állam. Ez a legfiatalabb, tán azért a
legkedvesebb.
Az irást a ládába tette, gondosan elzárta, majd a ládára ülve, egy
darabig mosolyogva nézett farkasszemet Viczkyvel.
– Fráter, te most azt gondolod magadban, hogy Samu bátyád
csendesen megbolondult, a mióta nem láttad. Nos, ha bolond
vagyok, akkor egész életemben bolond voltam, mert ennek a három
pörnek éltem. Ezért a három pörért dolgoztam, csaltam, loptam és
ezért halok meg, mert a pöreim nem engedik, hogy életben
maradjak. Nincsen ilyen három pör Magyarországon. Ha el akarod
őket adni, megcsalnak. Azért én azt mondom, ne add el őket. Fölér
ez a három pör az Esterházy-vagyonnal. Hogy szeretem őket. Hát
vettem őket… Azaz, hogy talán nem is egészen vettem, mert a
pörösködők nagyrésze már régen a föld alatt van, de a pör folyik
tovább. Megfogadtam a leghiresebb fiskálisokat Budapesten,
Bécsben és Berlinben, a hol a pörök lejátszódnak. Utaztam,
fáradoztam, beléöregedtem. Kielégítettem türelmetlen örökösöket és
a tanukat esztendőkig tartottam és fizettem, hogy meg ne vehessék
É
őket. És most, még kérded, hová lett édesapád hagyatéka? Itt van
megtizszerezve ebben a ládában, a melynek kulcsát átnyújtom
neked.
Viczky nem vette át a kulcsot, hanem így szólt:
– Nyissa ki Samu bátyám azt a kincsládát.
A míg az öreg a láda zárával bajlódott, Viczky megpiszkálta a
pohos kályhában hamvadó tüzet. A hamu alól láng csapott, aztán
mikor nyitva volt a láda, kivette belőle az irásokat és egyenkint
beledobálta a tűzbe. A láng felcsapott, meg elhamvadt, piszkos
korom szállott ki a kályha ajtaján…
Baracskay Sámuel megdermedve, szinte öntudatlanúl nézte
pöreinek elhamvasztását.
– Szerencsétlen, – nyögte és eltakarta az arczát, – most már
semmid sincs a világon.
Viczky vállat vont és keserűen mondta:
– Samu bátyám semmi roszat nem tett, csupán az örökhagyó
intézkedéséhez ragaszkodott. Az apám azt akarta, hogy szegény
ember legyek. Nos, Baracskay bácsi ezt megcselekedte.
– Ne vádolj, – emelte fel a kezét a megtört öreg ember. – Én jót
akartam.
– Tudom, – felelt egykedvűen Viczky. – Tudom, hogy másképen
gondolta a végét, Samu bátyám. Gyerekkoromban sokszor hallottam
az apámtól, mikor aranyait szórta: valahogy csak tönkre kell menni!
Ha kártyás ember lett volna a gyámom, elkártyázta volna az
örökségem. Elverte volna asszonyra egy másik gyámom. Samu bácsi
a pörökre költötte. Gombház. Megvan még a bűvös erszény.
Az öreg fiskális tagadólag rázta a fejét:
– Nincs meg. Tűvé tettünk mindent. Blásik félig megbolondult tiz
esztendő alatt. Az erszény nincs. Elvitte apád a másvilágra.
Viczky nyugodtan mondta:
– Én azt hiszem, ha keresni fogom, én megtalálom. De nem is
keresem…
Baracskay bácsi, látván gyámfiának a nyugodtságát, a melylyel a
váratlan csapást fogadta, halkan megkérdezte:
– Nos és kivánod, hogy agyonlőjjem magam? Mert én már csak
golyót érdemlek.
– Azt a bolondot csak nem teszi, Samu bácsi! – kiáltott fel Viczky.
– Érdemes is volna! A Viczky vagyona veszett el; arra való az, hogy
elvesszen.
– De mégis, édes fiam, – mormogta reménykedve Baracskay
bácsi. – Gondold meg jól a dolgot. Én már számot vetettem
mindennel. Nekem most már jobb volna, ha nem kellene
megmásítani elhatározásomat.
Viczky az öreg fiskális vállára tette a kezét, a szemébe nézett és
őszinte hangon mondta:
– Kedves bátyám, én előre tudtam azt, hogy ez fog történni.
Higyje el, nem haragszom. Egy csöppet sem haragszom. No,
béküljünk ki, Samu bácsi.
Az öreg vonakodva nyújtotta a kezét, mint a ki valami bizonytalan
alkuba bocsátkozik, aztán felsóhajtott:
– Nos, jól van, megteszem. De csupán neked teszem. Jöhetne
hozzám a nádorispán maga, annak se engednék. Olyan igaz, mint
hogy Baracskay a nevem, – fűzte hozzá erősködve.
Megpiszkálta a kályhát, hogy a hamvadó tűz ismét lángra kapjon.
– Az ördög vigye el a pöröket. Csakhogy már ezen is túlestünk, –
kiáltott fel és jókedvűen dörzsölgette a kezét. Hátát a kályhának
támasztotta és vidáman nézett az előtte álló fiatalemberre:
– Hm, csinos fiú vagy… Azt hiszem, egy jó házassággal
reperálhatnánk a dolgot. Van is egy pártim. No ne csinálj olyan
fancsali arczot. Becsületemre mondom, hogy nem tréfálok. Viczky de
Viczkó még mindig megélhet a neve után is, habár a mai világban
igen roszak a pénzügyi konjunkturák és a kutyabőr nem sokat ér.
– Ráérek még a házasságra, – felelt kitérőleg Gábor.
Baracskay bácsi összecsapta a kezét:
– Bolond beszéd! A házasságra tulajdonképen sohasem ér rá az
ember. Én például… No de hagyjuk az én dolgomat. Az ember akkor
házasodik meg, a mikor az esze azt parancsolja. Mind bolond az, a ki
a szivére hallgat. A boldog házasság olyan, mint a pezsgő. Bor is,
meg nem is bor. Bor is van benne. Nos hát a jó házasságnál
beszélhet a sziv is, de nem szabad csupán a szivre hallgatni.
Viczky azzal vélte legkönnyebben elnémítani az öreget, hogy
nyugodtan elmondta neki, hogy Pesten már van valaki, a kit
kiszemelt magának, az öreg Fátyol lánya…
Baracskay bácsi türelmesen végighallgatta a gyámfia szavait.
Csöppet sem lepte meg őt a dolgok állapota. Vidáman bólingatott a
fejével és csettintett az ujjával:
– Kutya-teremtette! Magam is keresztülestem a bárányhimlőn;
minden egészséges ember keresztül megy rajta. Magam is… De
hagyjuk az én dolgomat. Persze, persze, csinos a fruska. Hej, azok a
fruskák, azok a fruskák!… Habár én abban a korban, a melyben te
vagy, az öreganyámba voltam szerelmes. No, nem épen az igaziba,
de lehetett volna akár az öreganyám is az illető. A mai fiatalságnak
mások a virtusai, mint a régié. Tempora mutantur.
Viczky tréfás komolysággal kérdezte:
– Talán azt akarja, Samu bátyám, hogy én is az öreganyámba
legyek szerelmes?
– Világért se! – tüzelt az öreg. – Csak szeresd te mindig a
fruskákat, mert hidd el nekem, hogy addig ér valamit az asszonyféle,
a míg rövid a szoknyája. Magam is… No de hagyjuk az én dolgomat.
De feleségül mégis csak azt vedd, a kit én választok ki a számodra. A
vén szem többet lát, mint a fiatal szem, mert a vén szemben
kevesebb már a szines anyag, a mely rózsaszinűnek mutatja az
életet.
Felemelte a kezét, csettintett a nyelvével:
– Remek pártim van számodra.
Viczky kedvetlenűl fordított hátat:
– Nyugodjon bele, Samu bácsi, a megváltoztathatlanba. Én csak
azt veszem el, a kit szeretek.
Az ajtón kopogtattak és Blásik János dugta be a fejét. Hivatalos
hangon jelentette:
– Az óra már éjfélre jár. Tekintetes ügyvéd úr, fejezzük be a
hazudozást. A kisgazdámnak aludni is kell.
Viczky meglepődve nézett Blásikra.
– Hát kend engem vár?
– Igenis, – felelt az egykori udvarmester, – én a megdicsőült
urunk fiát nem hagyom el se földön, se égen.
Viczky elbucsúzott a gyámapjától.
– Édes fiam, – mondta Baracskay bácsi szinte meghatottan, –
verd ki a fejedből Fátyol Rózsikát. Én mondom neked, a ki az életet
ismerem, hogy az egész tervet a vén Fátyol eszelte ki, mert nagy
gazember az öreg. Nyakadba akarja sózni egyik lányát. Szinészkedés
az egész. Minden fiatalembernek kivetnek ilyesféle hálót. Sok
belebukik, némely elkerüli. Ne higyjél azoknak a lányoknak, a kiknek
semmijük sincs. Azok mindig komédiáznak. Fiatalság: bolondság. A
szerelem elmúlik és marad a szegénység. No, aludj jól. A «Griff»-ben
jó szobák vannak. Aludt benne az apád is.
A míg Viczky a Blásik János kiséretében – a ki lámpát vitt előtte,
– a «Griff» felé ballagott, mindenféle zavaros gondolatok és
érzelmek torlódtak össze benne. Most már bizonyos, hogy a mi
vagyonkája volt, az elúszott a gyámapja kezén, a mint az
előrelátható volt. Nem is nagyon haragudott az öregre.
Természetesnek találta, hogy elköltötte a gondjaira bízott pénzt.
Ismerte már az embereket annyira, hogy meg tudott nekik
bocsátani. De már most mi lesz tovább. Azzal állítson be Rózsához,
hogy még egy szoknyát sem vehet neki a vagyonából? Mert ha a
zöld erszényt nem találja meg, akkor semmije, semmije nincs. A zöld
erszény pedig mind bizonytalanabbá válik, hisz Baracskay bácsi a
föld alól is előkerítette volna a pörei folytatásához.
Egy utczakeresztezésnél a vak éjszakában megállott Blásik János
a lámpával és az utat mutatta:
– Vigyázzunk a kanálisra, kisgazdám. Sok ember kitörte már itt a
lábát.
Mikor a veszedelmes ponton átjutottak, Viczky így szólt
Blásikhoz:
– Tudja-e, János, hogy egy kis baj van az apai jussommal?
– Tudom, tudom, – felelt Blásik. – Az egész város tudja régen. A
szegény tekintetes úr nem tehet róla. Kutyaszenvedély a pörösködés.
– Hát azt az erszényt, a mit a fekete kakas elvitt, keresték-e?
Blásik megállott a lámpással. Suttogó, szenvedélyes hangon
válaszolt:
– Kerestük, de hiába kerestük. Jó helyen van az!
Viczkynek megdobbant a szive.
– Hol van, János?
Blásik a szájára tette a kezét és a fejét rázta. Egy darabig
küzködött magával, aztán kimondta:
– Az erszény nem lehet máshol, mint özvegy Viczkynénél, a ki a
kertünk végében lakott. De most már nem mondok többet.
Elérték a «Griff»-et. A régi, tisztújítás-korabeli szálló, mint egy
nagy, fekete sírdomb emelkedett ki az éjszakából. A földszinten
világos volt és czigánymuzsika hangzott ki a vasrostélyos ablakok
megől. A nagybőgő morgásába hangos pohárcsengés vegyült.
– Ugyan kinek van olyan széles kedve? – kérdezte Viczky Gábor. –
Itt nem igen lehet majd aludni az éjszaka.
Blásik János felkapaszkodott a sarokkőre és bepislogott a szines
függönyökön, a melyekre Kossuth és Rákóczy képe volt festve.
Nevetve tért vissza:
– Ugyan ki mulatna más, mint Zathureczky tekintetes úr. Nincs
ebben a vármegyében másnak pénze a mulatozásra.
Viczky emlékezett Zathureczkyre még a gyermekkorából. Akkor is
országraszóló lump volt az öreg Zathureczky és ő volt a leghíresebb
tánczos. Eszébe jutottak a bolondnál bolondabb tréfák, a melyeket
atyjával együtt követett el a híres tréfacsináló. Egyszer csaknem
felgyújtották a házat jókedvükben. De az sem volt az utolsó dolog, a
mikor Zathureczky egy szakajtó új krajczárt szórt ki a Viczky-ház
ablakából a hetivásáros nép közé. Olyan dulakodást, marakodást se
látott azóta a világ. «Viczkyre rájött a bolondja!» – kiabálták az
emberek és az egész város összecsődült kapkodni az «aranyak»
után. Igaz, hogy a félrevezetett utczai nép sorban beverte a Viczky-
ház ablakait, de Viczky Ede csaknem halálra kaczagta magát.
– Köszönöm, Zathureczky. Igazi aranyakkal sem csinálhattunk
volna nagyobb kutyakomédiát.
– Látod, hogy olcsón is lehet mulatni, – mondta Zathureczky és
azóta vált szokásává Viczky Eduárdnak, hogy az aranypénzei közé új
krajczárokat kevert. Zathureczky megtanította takarékoskodni.
Az emlékezésre Gábornak felmelegedett a szive és felkiáltott:
– Ejnye, hát él még az öreg, meg kellene nézni.
Az étkező-szoba kilincsére tette a kezét, de Blásik János elébe
ugrott:
– Majd én megyek előre, kisgazdám. Nem igen tanácsos ide
belépni akkor, ha az urak mulatnak. Néha pisztolylövéssel fogadják a
hivatlan vendéget, de a borosüveg: az biztos.
Egy percz múlva, amint Blásik János bement, felpattant az ajtó és
egy szikár, őszbecsavarodott, pirosképű férfiú lépett ki rajta. Az egyik
lába kissé biczegett, de azt ügyesen rejtegette, hogy szinte
affektácziónak látszott a sántasága. Két karját ölelésre tárta:
– Viczky! – kiáltotta. – Egy igazi Viczky van a szemhatáron és ezt
mi csak most tudjuk meg! Ezer ördög. Még tán a mozsarak sem
pukkantak, a mikor jöttél? Ejnye, ejnye, mért nem irtad meg előre a
jöveteledet?
Megölelte Viczky Gábort és kétoldalról megcsókolta az arczát.
Tetőtől-talpig végignézte.
– Megemberesedtél, – mondta elismerőleg. – De az apádhoz nem
hasonlítasz. Inkább az anyádhoz. Ezek az ábrándos tekintetü
szemek, ez a beszédes kis száj az édesanyádé… Engedd meg, fiam,
hogy megmondjam neked, szebb asszony, mint az édesanyád, nem
volt három vármegyében. Mit csinál, egészséges?
Viczkynek eszébe jutott, hogy már régen kapott levelet az
édesanyjától Bécsből, a hol azóta a bárónőnek szegénynek sora
jobbra fordult és alapítványi hölgy lett.
– Nincs semmi baja, – felelt.
– Kérlek, el ne felejtsd hódoló kézcsókomat átadni, ha véle
találkozol. Bizonyosan emlékezni fog a bolondos Zathureczkyre. Én
mindig olyan jó bolond voltam a hölgyek körűl.
A tágas étteremben a középső részt a czigánybanda foglalta el.
Ott muzsikált a Kövér Benczi Gyula, a ki három aranyórát hordott
mindig a mellényében és az ingeit Bécsben mosatta. A híres Benczi
czigányba ojtott úr volt. Dehogy is fogadott volna el pénzt a régi
világban, tönkrement gavalléroktól. Minek? Neki több volt, valóságos
czigányprimás volt. Házai, földjei voltak. De ha Zathureczkytől öt
forintot kapott, jobban örült annak, mint ha valamely
meggazdagodott lócsiszár százasokat dobott a tányérjára. Ismerte,
hogyne ismerte volna az öreg Viczkyt. Egyszer ezerforintost
ragasztott a homlokára. Az ilyesmit nem szokás elfelejteni. Tussal
fogadta Viczky Gábort és Zathureczky oly büszkén kapaszkodott a
fiatalember karjába, mintha a trónörököst vezette volna.
– Nini, ezek talán nem tudják, hogy semmim sincs? – kérdezte
magában Viczky, a mikor az alázatosan mosolygó czigányok,
pinczérek sorfala között elhaladt.
A sarokban egy kis asztalka állott, rajta egy félliter lőre, a míg a
czigányok körűl ezüstvedrekben pezsgő állott. Az asztalkához vezette
Zathureczky Gábort és ott nagy szertartásosan helylyel kinálta:
– Ne vesd meg szerény asztalomat. Mit parancsolsz? Pezsgőt
vagy szilvoriumot. Én sohasem iszom pezsgőt, csak kocsisbort.
Viczky tapintatosan felelt:
– Veled tartok.
Zathureczky megtöltötte a poharakat.
– Isten hozott, fiam, csakhogy már egyszer mi is eszedbe
jutottunk. Remélem, most már itt maradsz nálunk. A homok csak a
homok mellett érzi jól magát. A hol egyedül van a homok, ott elfújja
a szél, de a sok homokkal a vihar sem birt. Mi homokok vagyunk.
Még egyszer: Isten hozott. És ha valami hivatal kell, csak nekem
szólj.
– Egyelőre nem szándékozom hivatalt vállalni, – felelt Viczky
röstelkedve.
– Nono, valamiből csak kell élned, fiam. Nem hiszem, hogy az
öreg Baracskaytól húsz krajczárt visszavasalhass. Könnyelmű ember,
de meg kell neki bocsátani, mert vannak jó tulajdonságai is. Igyunk,
Gábor.
A bor savanyú és dohos volt, igazi kocsisbor, a mely kinyitja a
bicskát az ember zsebében. Zathureczky észrevette, hogy Gábornak
nem izlik az ital.
– Parancsolsz pezsgőt? Van annyi, a mennyi kell. Hé, Barkó úr!
Rákiáltott a fogadósra, a ki a Viczky Gábor megbámulására
szintén a szobába sompolygott. A vörösképű emberke ügyetlen
hajlongással közeledett.
– Hány üveg pezsgőm van még a pinczében?
Barkó előrántotta könyvecskéjét és hadarva felelt:
– Ha a mai fogyasztást is beleszámítjuk, még hatszázötvenhárom
üveg áll odalenn, vagy legalább is kell állnia.
Zathureczky fejedelmi kézmozdulattal elbocsátotta a fogadóst és
Gáborhoz fordult:
– A mint láthatod, pezsgőnk van elég, ha pénzünk nincs is.
Kiváncsi vagy, hogy honnan van annyi pezsgőm. Hát a múltkoriban
nyertem ezer üveg pezsgőt.
– Jeles ember lehet, a ki ezer üveg pezsgőbe fogad.
Zathureczky nevetve fújta a füstöt a mennyezet felé:
– Koránsem jeles ember. A ragyás Bunkó bácsi, a nyugalomba
vonúlt uzsorás az illető. A vén gazember, a ki hosszú életében még
az elhasznált gyufaszálakat is összegyűjtögette fűtőanyagnak télire,
vénségére megengedte magának azt a luxust, hogy idejárjon a Griff-
kávéházába egy pohár tejecskére. El szokott üldögélni egész éjszaka,
mert aludni nem tud és a világosságot ingyen kapja. A minap aztán
éjszakai unaloműzésből egy kis bűvészeti előadást tartottam a
fiúknak a billiárd-asztal felett. Ezüstforintosokat varázsoltam elő a
fülekből, gallérokból, zsebekből. Az öreg Bunkó csakhamar
érdeklődni kezdett és a sarokból odatipegett. Villogó szemmel kisérte
az ezüstforintosok bűvös vándorlását, eltűnését és a midőn az ő
zsebében találtuk meg az eltűnt forintost, magánkívül volt az öreg a
meglepetéstől:
– Becsületemre, – dadogta, – sohasem hordok magamnál többet
tiz krajczárnál, mert félek a rosz emberektől…
– Pedig ott, a honnan ez a forint kikerűlt, van még több is, –
mondtam, «visszaadván» neki az ezüstforintosát.
– De bizony nincsen, – esküdözött az öreg. – Hisz csak ismerem
a kabátomat, – kiáltott fel, össze-vissza forgatva a megzöldült,
ezerfoltú alkotmányt, a mely tagjait födte.
– Hát én mernék fogadni, hogy legalább tiz ezüstforint van a
zsebeiben. Száz forintot teszek tiz üveg franczia pezsgő ellen. (Mert
épen szomjasak voltak a fiúk.)
A ragyás Bunkó nem szólt semmit; kiment az udvarra és miután
mégegyszer alaposan keresztül-kasul vizsgálta zsebeit, vigyorogva
tért vissza.
– Tartom a fogadást! – kiáltotta.
Nyomban papirost, tintát hozattam és Fabula fiskálist felállítottuk
a piquet mellől.
– Húzd fel az eszed, pörvesztő, – mondtam neki, – olyan legyen
az az irás, hogy akár a törvény előtt is foganatja legyen.
– Nono, – dörmögte a vén Bunkó, mert a törvényről nem szeret
hallani.
A tanuk aláirták az irást, én pedig Bosco nyomdokain haladva,
kiráztam az ezüstforintosokat az öreg kabátjának a belső zsebéből.
A vén gazember kékült-zöldült, de fizetett.
Másnapra már el is felejtettem az egész históriát, a mikor a
kávéházban a hátam mögé lopózik a vén Bunkó és a fülembe súgja:
– Tekintetes uram, fogadnék ám ma is.
Linneburg kapitány, a partnerem, épen tricc-et irt ellenem,
roszkedvűen feleltem:
– Hagyjon békét, ma nem játszunk.
Az uzsorás szemtelenűl felelt:
– A tekintetes úr revanche-sal tartozik.
Erre elfogyott a béketűrésem, pedig fát lehet vágni a hátamon,
olyan türelmes ember vagyok. Felugrottam.
– Szedte-vedte, vén gazember. Én neked revanche-sal tartozom?
Hát te ugyan miféle revanche-ot adtál nekem a kiuzsorázott
nagyanyai jussomért?
– Pardon, – felelt Bunkó. – Az régen volt, elévült. De ez csak
tegnap volt.
– Helyes, – mondtam, – fogadok, de csak száz üveg pezsgőbe.
– Tartom! – kiáltott fel a ragyás Bunkó.
Fabula ügyvédet megint felállították a piquet mellől és az ügyvéd
megirta a kontraktust. Bunkó diadalmasan állott ki a kávéház
közepére.
– No, tekintetes úr, most lássuk a forintosokat. Minden zsebemet
bevarrtam.
Csakhogy az öreg Boscónak erre is volt módszere. A forintosok
bizony csak kipotyogtak az ócska kabátból, mire a varázsszavak
elhangzottak.
Bunkó Mihály csaknem összerogyott ijedtségében.
– Vizet! – hörögte és homlokán kidagadtak az erek. – Csalók,
haramiák körmei közé kerültem. Zsiványok! Segítség!
Tombolt dühében a kávéház közepén és a nézők harsogó
kaczagása kisérte a vén gazember kétségbeesett üvöltését. Szép is,
a mikor a hóhért akasztják.
– Nem fizetek! – jelentette ki végtére.
– Fabula, holnap add be a keresetet.
– Egyezkedem, – esdekelt az uzsorás.
Fabula jóizű ember, de nem szereti, ha piquet-nél zavarják. Hátat
fordított a vén gazembernek.
– Legyen szerencsém holnap irodámban, Bunkó úr, a kishíd
mellett, balra…
– Csak nem viszem az irhám a vágóhídra! – üvöltött Bunkó. –
Inkább fizetek. De én is veletek iszom.
– Az nincs a szerződésben, – feleltem. – Én csak urakkal iszom.
És most jön a java a történetnek, öcsém, Viczky Gábor. A vén
gazember uzsorás, a ki ötven esztendeig túljárt a birák, ügyvédek
eszén, a kitől harapófogóval nem lehetett kihúzni egy lyukas
krajczárt sem, azóta minden este ott ül a kávéházban és esdekelve
kéri, hogy fogadjak vele… Új ruhát csináltatott már azóta, – talán az
első új ruhát életében. De Bosco csalhatatlan… Szivarozik és egész
éjjel pezsgőt iszik, a mit külön rendel és egyedül iszsza a kávéház
sarkában. Teljesen belebolondult a bűvészetbe és a múltkoriban már
Fánnikát, a kassza tündérét is megkinálta pezsgőjéből. Hisz úgyis
mindegy. Mert – ez a morálja a történetnek, – nincsen olyan lakat a
világon, a melyet ki ne tudna nyitni egy ügyes lakatos. A lakatot
Zathureczky kinyitotta és a tréfa tökéletesen sikerűlt.
Viczky Gábor nevetve hallgatta végig a Zathureczky előadását.
– Jer, megmutatom az öreg Bunkót!
Felállottak az asztaltól és az üvegajtóhoz mentek, a mely a
kávéházi helyiségbe nyilott. Az üvegajtót felnyitotta Zathureczky és a
sarokba mutatott. Egy torzonborz vén ember ült a kávéházi asztalnál
és kezében vastag szivart tartott. A mikor megpillantotta
Zathureczkyt, dühösen állott talpra és fenyegetőleg közeledett. De
egyszerre lekapta a kerek kalapot a fejéről, a mikor Viczky Gábort
megpillantotta:
– Tekintetes úrfi, nagyságos uram, engedje meg, hogy az öreg
Bunkó Mihály alázatosan bemutassa tiszteletét.
Viczky meglepetten nézett a hajlongó vén emberre.
Zathureczky felemelte a kezét és félig tréfásan, félig komolyan
felkiáltott:
– Távozz, vámpír.
Bunkó kedélyeskedve dörzsölte a kezét:
– Vámpír? A Bunkó bácsi jó ember. Majd meglátja a fiatal úr.
Meglátja…
Zathureczky karonfogta Viczkyt:
– Hagyjuk a vén gazembert. Reméljük a legjobbat; azt, hogy
nem lesz szükségünk a barátságára.
A mikor az asztalhoz letelepedtek, a czigány közelebb húzódott
Viczkyhez és a fülébe súgta:
– Az édesapja nótája! Hallgassa csak, tekintetes úr.
Víg, muzsikás hangulat telepedett a mulatókra. Egyik nóta a
másikat kergette. Zathureczky kitünően tudta dirigálni a czigányt, –
megtanulhatta annyi esztendő alatt, – míg Gyula prímás az ország
legjobb czigánya volt. Hajlongott, alázatoskodott a kopott gavallér
előtt és fel-felragyogott a szeme, a mikor Zathureczkynek egy-egy
nagyon régi, elfeledett nóta jutott az eszébe. Mert a czigány is azt a
nótát szereti, a mi nagyon régi.
Mulatságközben Viczky egyszerre a barátja vállára tette a kezét:
– Mondd, Gazsi, itt nem tudják ez emberek, hogy nekem
semmim sincsen? Mit gondol a vén Bunkó magában?
Zathureczky nagyot nevetett:
– Tudja azt, öcsém, mindenki, hogy Baracskay elspekulálta a
vagyonodat, de azzal egyelőre nem törődnek. Te egy darabig a régi,
a milliomos Viczky leszel, a míg le nem kopik rólad az egész dicsőség
és az emberek megszokják, hogy épen olyan közönséges halandó
vagy, mint a többi. A mi környékünkön tiszteletben tartják az
emlékeket: addig, a meddig.
Viczkynek kipirosodott az arcza:
– Hátha csakugyan az igazi Viczky volnék, a milliomos Viczky?
Hiszen tudod, hogy van bizonyos legenda az apám eltűnt
vagyonáról?
– Hallottam róla, csakhogy ahhoz az eltűnt vagyonhoz nehéz lesz
hozzájutni. Melánie jól vigyáz rá.
– Ki az a Melánie?
Zathureczky csodálkozva nézett rá:
– Nem ismered az unokatestvéredet, Viczky Melániet? A legszebb
lány, a legjobb párti a vármegyében. Minden gyerek tudja, hogy
özvegy Viczkyné kerítette magához azt a bűvös erszényt. Sokáig
titkolta a ravasz asszony. Évekig tudta rejtegetni, palástolni
gazdagságát. Nem mozdultak ki a kis házból, pedig abba már a viz is
befolyt. De mióta Melánie nagy leány lett, azóta ereszt valamicskét a
vén sárkány. De most is jobban szereti, ha kölcsönpénzzel
manipulálhat. A rejtett vagyonhoz nem akar nyúlni. Épen a vén
gazember Bunkó a bankárja.
Viczky hitetlenkedve csóválta a fejét.
– Nos és látta valaki azt az erszényt, azt a vagyont?
– Nem bolond az öregasszony, hogy mutogassa. De hát minek is
mutogatná, a mikor mindenki tudja, hogy megvan. Ott őrzi a
szalmazsákja alatt. Van abban az erszényben egy bankutalvány, a
mely Angol-bankra szól.
Viczky ámulva hallgatta a Zathureczky szavait:
– Nekem azt soha senki se mondta. Hisz akkor
visszakövetelhetném özvegy Viczkynétől az eltűnt vagyonomat?
– Hát pöröld, – nevetett nagyvigan Zathureczky, – pöröld öcsém,
de nem hiszem, hogy fiskálist találsz, a ki a pörödet elvállalja. Még
tán Baracskay bácsi is kinevetne ezzel a pörrel. Pörölni csak ott
lehet, a hol látható, megfogható vagyon van. Viczkyné pedig nem
bolondult meg, hogy házakba, földekbe verje a pénzét, hogy arra
rátehessed majd egyszer a kezed. Ravasz asszony az. A
legravaszabb az országban. Egyebekben mi már régen szépen
megállapítottuk magunkban, hogyan fog végződni ez a dolog. A
horoskóp szerint eljön Viczky Gábor, már mint te, belészeret
Melánieba, Melánie a felesége lesz és az eltűnt vagyon visszakerűl
jogos tulajdonosához, sőt még egy világszép leányt is kapsz
ráadásul. Az erkölcsi világrend helyre lesz állítva és olyan hosszú,
boldog életkort értek, mint a mesében.
– Hm, – mormogta Viczky, – nekem okvetetlenűl el kell venni
Melániet, a kit nem is ismerek.
– Fiacskám, ezen már nem lehet változtatni. Réges-régen
elhatároztuk már ezt egymás között, a mikor a dolog tapétra kerűlt
kaszinóban, korcsmában… Sőt, ha a fáma igazat mond, özvegy
Viczkyné is azért utasítgatta volna vissza eddig a kérőket, mert
számít rá, hogy elveszed a lányát.
Viczky nevetni kezdett:
– De hiszen nem is ismerem a lányt!
– Hogyne ismernéd! És ha nem is ismered, majd megismered.
Erről most már ne is beszéljünk. Mulassunk! Gyula, azt a Beleznay-
nótát.
Viczky Gábor, a mikor reggel felé zúgó fejjel ágyára vetette
magát, így szólt magában:
– Most nem tudom, én bolondultam-e meg, vagy az idevaló
emberek! Aludjunk rá egyet. Minden esetre meg van valahol az
erszény. És én megtalálom.
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebooknice.com

You might also like