Author(s): Alan D. Moore; B.M. Harwani
Publisher: Packt Publishing
Year: 2019
Title Page
Copyright
Python GUI Programming - A Complete Reference Guide
About Packt
Why Subscribe?
Packt.com
Contributors
About the Authors
Packt Is Searching for Authors Like You
Preface
Who This Book Is For
What This Book Covers
To Get the Most out of This Book
Download the Example Code Files
Conventions Used
Get in Touch
Reviews
Introduction to Tkinter
Introducing Tkinter and Tk
Choosing Tkinter
Installing Tkinter
Installing Python 3 on Windows
Installing Python 3 on macOS
Installing Python 3 and Tkinter on Linux
Introducing IDLE
Using the shell mode of IDLE
Using the editor mode of IDLE
IDLE as a Tkinter example
Creating a Tkinter Hello World
Creating a better Hello World Tkinter
Summary
Designing GUI Applications with Tkinter
A problem at ABQ AgriLabs
Assessing the problem
Gathering information about the problem
What you found out
Information about the data being collected
Information about the users of the application
Documenting specification requirements
Contents of a simple specification
Writing the ABQ data entry program specification
Designing the application
Exploring Tkinter input widgets
Grouping our fields
Laying out the form
Laying out the application
Summary
Creating Basic Forms with Tkinter and ttk Widgets
Evaluating our technology choices
Choosing a technology
Exploring Tkinter widgets
The Entry widget
The Spinbox widget
The Combobox widget
The Checkbutton widget
The Text widget
The Button widget
The LabelFrame widget
Implementing the application
Saving some time with a LabelInput class
Building the form
Adding LabelFrame and other widgets
Retrieving data from our form
Resetting our form
Building our application class
Saving to CSV
Finishing and testing
Summary
Reducing User Error with Validation and Automation
Validating user input
Strategies to prevent data errors
Validation in Tkinter
Creating a DateEntry widget
Implementing validated widgets in our form
Exploiting the power of multiple inheritance
A validating mixin class
Building our widgets
Requiring data
A Date widget
A better Combobox widget
A range-limited Spinbox widget
Dynamically adjusting the Spinbox range
Updating our form
Displaying errors
Preventing form submission on error
Automating input
Inserting a date
Automating Lab, Time, and Technician
Summary
Planning for the Expansion of Our Application
Separating concerns
The MVC pattern
What is a model?
What is a view?
What is a controller?
Why complicate our design?
Structuring our application directory
Basic directory structure
The abq_data_entry.py file
The README.rst file
ReStructuredText
Populating the docs folder
Making a Python package
Splitting our application into multiple files
Creating the models module
Moving the widgets
Moving the views
Removing redundancy in our view logic
Creating the application file
Running the application
Using version control software
A super-quick guide to using Git
Initializing and configuring a Git repository
Adding and committing code
Viewing and using our commits
Summary
Creating Menus with Menu and Tkinter Dialogs
Solving problems in our application
Deciding how to address these problems
Implementing simple Tkinter dialogs
Tkinter messagebox
Showing the error dialogs
Designing our menu
Creating menus in Tkinter
Implementing our application menu
Showing an About dialog
Adding the menu functionality in the controller
Handling file selection
Making our settings work
Persisting settings
Building a model for settings persistence
Using the settings model in our application
Summary
Navigating Records with Treeview
Implementing read and update in the model
Adding read and update to our model
Implementing get_all_records()
Implementing get_record()
Adding update to save_record()
Implementing a record list view
The ttk Treeview
Implementing our record list with Treeview
Configuring a Treeview widget
Adding a scrollbar
Populating the Treeview
Responding to record selection
Modifying the record form for read and update
Updating __init__()
Adding a load_record() method
Updating the rest of the application
Main menu changes
Connecting the pieces in Application
Adding the RecordList view
Moving the model
Populating the record list
Adding the new callbacks
Cleaning up
Testing our program
Summary
Improving the Look with Styles and Themes
Working with images in Tkinter
Tkinter PhotoImage
Adding the company logo
Setting our Window icon
Styling Tkinter widgets
Widget color properties
Using widget properties on our form
Using tags
Styling our record list with tags
Tkinter fonts
Giving users font options
Styling Ttk widgets
Exploring a Ttk widget
Styling our form labels
Styling input widgets on error
Making our Spinbox a Ttk widget
Updating ValidatedMixin
Setting themes
Building a theme selector
Summary
Creating Automated Tests with unittest
Automated testing basics
A simple unit test
The unittest module
Writing a test case
TestCase assertion methods
Fixtures
Using Mock and patch
Running multiple unit tests
Testing Tkinter code
Managing asynchronous code
Simulating user actions
Specifying an event sequence
Managing focus and grab
Getting widget information
Writing tests for our application
Testing our model
Testing file reading in get_all_records()
Testing file saving in save_record()
More tests
Testing our application
Testing our widgets
Unit testing the ValidatedSpinbox widget
Integration testing the ValidatedSpinbox widget
Testing our mixin class
Summary
Improving Data Storage with SQL
PostgreSQL
Installing and configuring PostgreSQL
Connecting with psycopg2
SQL and relational database basics
Basic SQL operations
Syntax differences from Python
Defining tables and inserting data
Retrieving data from tables
Updating rows, deleting rows, and more WHERE clauses
Subqueries
Joining tables
Learning more
Modeling relational data
Normalization
The entity-relationship diagrams
Assigning data types
Creating the ABQ database
Creating our tables
Creating the lookup tables
The lab_checks table
The plot_checks table
Creating a view
Integrating SQL into our application
Creating a new model
Adjusting the Application class for the SQL backend
Building a login window
Using the login window
Fixing some model incompatibilities
DataRecordForm creation
Fixing the open_record() method
Fixing the on_save() method
Creating new callbacks
Updating our views for the SQL backend
The data record form
The record list
Last changes
Summary
Connecting to the Cloud
HTTP using urllib
Basic downloading with urllib.request
Creating a download function
Parsing XML weather data
Implementing weather data storage
Creating the SQL table
Implementing the SQLModel.add_weather_data() method
Updating the SettingsModel class
Adding the GUI elements for weather download
HTTP using requests
Installing and using requests
The requests.session() fucntion
The response objects
Implementing API upload
Creating a test HTTP service
Creating our network function
Updating application
Updating the models.py file
Finishing up
FTP using ftplib
Basic concepts of FTP
Creating a test FTP service
Implementing the FTP upload function
Listing files
Retrieving files
Deleting or renaming files
Adding FTP upload to the GUI
Summary
Visualizing Data Using the Canvas Widget
Drawing and animation with Tkinter's Canvas
Animating Canvas objects
Creating our objects
Animating the racers
Detecting and handling a win condition
Creating simple graphs on the canvas
Creating the model method
Creating the graph view
Updating the application
Advanced graphs using Matplotlib and Tkinter
Data model method
Creating the bubble chart view
Application method
Summary
Creating a User Interface with Qt Components
Introduction
PyQt
Ways of creating GUI applications
Displaying a welcome message
Understanding the Label widget
Methods
Understanding the Line Edit widget
Methods
Understanding the Push Button widget
How to do it...
How it works...
Using the Radio Button widget
Understanding Radio Button
Methods
Signal description
How to do it...
How it works...
Grouping radio buttons
Getting ready
How to do it...
How it works...
Displaying options in the form of checkboxes
Getting ready
Method application
Signal description
How to do it...
How it works...
Displaying two groups of checkboxes
Getting ready
How to do it...
How it works...
Event Handling - Signals and Slots
Introduction
Using Signal/Slot Editor
How to do it...
Copying and pasting text from one Line Edit widget to another
Getting ready
How to do it...
How it works...
Converting data types and making a small calculator
How to do it...
How it works...
Using the Spin Box widget
Getting ready
How to do it...
How it works...
Using scrollbars and sliders
Getting ready
How to do it...
How it works...
Using List Widget
Getting ready
How to do it...
How it works...
Selecting multiple list items from one List Widget and displaying them in another
How to do it...
How it works...
Adding items into List Widget
How to do it...
How it works...
Performing operations in List Widget
Getting ready
Methods provided by the QListWidgetItem class
How to do it....
How it works...
Using the Combo Box widget
How to do it…
How it works...
Using the Font Combo Box widget
Getting ready
How to do it…
How it works...
Using the Progress Bar widget
Getting ready
How to do it…
How it works...
Understanding OOP Concepts
Object-oriented programming
Creating a class
Using the built-in class attributes
Accessing class variables in instance methods
Instances
Using classes in GUI
How to do it...
How it works...
Making the application more elaborate
Inheritance
Types of inheritance
Using single inheritance
Getting ready
How to do it...
How it works...
Using multilevel inheritance
Getting ready
How to do it...
How it works...
Using multiple inheritance
Getting ready
How to do it...
How it works...
Understanding Dialogs
Introduction
The input dialog box
Using the input dialog
How to do it...
How it works...
Using the color dialog
How to do it...
How it works...
Using the font dialog
How to do it...
How it works...
Using the file dialog
Getting ready
How to do it...
How it works...
Understanding Layouts
Understanding layouts
Spacers
Using Horizontal Layout
How to do it...
How it works...
Using Vertical Layout
How to do it...
How it works...
Using Grid Layout
How to do it...
How it works...
Using Form Layout
Getting ready
How to do it...
How it works...
Networking and Managing Large Documents
Introduction
Creating a small browser
How to do it...
How it works...
Creating a server-side application
How to do it...
How it works...
Establishing client-server communication
How to do it...
How it works...
Creating a dockable and floatable sign-in form
Getting ready
How to do it...
How it works...
Multiple Document Interface
Getting ready
How to do it...
How it works...
Displaying information in sections using Tab Widget
How to do it...
How it works...
Creating a custom menu bar
How to do it…
How it works...
Database Handling
Introduction
Creating the cursor object
Creating a database
How to do it…
How it works…
Creating a database table
How to do it…
How it works…
Inserting rows in the specified database table
How to do it…
How it works…
Displaying rows in the specified database table
How to do it…
How it works…
Navigating through the rows of the specified database table
How to do it…
How it works…
Searching a database table for specific information
How to do it…
How it works…
Creating a signin form – applying an authentication procedure
How to do it…
How it works…
Updating a database table – changing a user's password
How to do it…
How it works…
Deleting a row from a database table
How to do it…
How it works…
Using Graphics
Introduction
Displaying mouse coordinates
How to do it...
How it works...
Displaying coordinates where the mouse button is clicked and released
How to do it...
How it works...
Displaying a point where the mouse button is clicked
How to do it...
How it works...
Drawing a line between two mouse clicks
How to do it...
How it works...
Drawing lines of different types
How to do it...
How it works...
Drawing a circle of a desired size
How to do it...
How it works...
Drawing a rectangle between two mouse clicks
How to do it...
How it works...
Drawing text in a desired font and size
How to do it...
How it works...
Creating a toolbar that shows different graphics tools
How to do it…
How it works...
Plotting a line using Matplotlib
Getting ready
How to do it...
How it works...
Plotting a bar using Matplotlib
Getting ready
How to do it...
How it works...
Implementing Animation
Introduction
Implementing animation
Displaying a 2D graphical image
How to do it...
How it works...
Making a ball move down on the click of a button
How to do it...
How it works...
Making a bouncing ball
How to do it...
How it works...
Making a ball animate as per the specified curve
How to do it...
How it works...
Using Google Maps
Introduction
Finding out details of a location or a landmark
How to do it…
How it works…
Getting complete information from latitude and longitude values
How to do it…
How it works…
Finding out the distance between two locations
How to do it…
How it works…
Displaying location on Google Maps
How to do it…
How it works…
Other Books You May Enjoy
Leave a review - let other readers know what you think