Explore Python's GUI frameworks and create visually stunning and feature-rich applications Key Features Integrate stunning data visualizations using Tkinter Canvas and Matplotlib Understand the basics of 2D and 3D animation in GUI applications Explore PyQt's powerful features to easily design and customize your GUI applications Book Description A responsive graphical user interface (GUI) helps you interact with your application, improves user experience, and enhances the efficiency of your applications. With Python, you'll have access to elaborate GUI frameworks that you can use to build interactive GUIs that stand apart from the rest. This Learning Path begins by introducing you to Tkinter and PyQt, before guiding you through the application development process. As you expand your GUI by adding more widgets, you'll work with networks, databases, and graphical libraries that enhance its functionality. You'll also learn how to connect to external databases and network resources, test your code, and maximize performance using asynchronous programming. In later chapters, you'll understand how to use the cross-platform features of Tkinter and Qt5 to maintain compatibility across platforms. You'll be able to mimic the platform-native look and feel, and build executables for deployment across popular computing platforms. By the end of this Learning Path, you'll have the skills and confidence to design and build high-end GUI applications that can solve real-world problems. This Learning Path includes content from the following Packt products: Python GUI Programming with Tkinter by Alan D. Moore Qt5 Python GUI Programming Cookbook by B. M. Harwani What you will learn Visualize graphs in real time with Tkinter's animation capabilities Use PostgreSQL authentication to ensure data security for your application Write unit tests to avoid regression when updating code Handle different signals generated on mouse clicks using QSpinBox and sliders Employ network concepts, internet browsing, and Google Maps in UI Use graphics rendering to implement animations in your GUI Who this book is for If you're an intermediate Python programmer looking to enhance your coding skills by writing powerful GUIs in Python using PyQT and Tkinter, this is an ideal Learning Path for you. A strong understanding of the Python language is a must to grasp the concepts explained in this book 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