We start by importing the different packages of the Python standard library and PyQt5 that we will need in this project. In addition, we import the gui_main.py and gui_newshapefile.py files so that the Ui_MainWindow and Ui_Dialog classes defined in them are available for creating the GUIs of the main window and dialog for creating a new shapefile, and of course the core_functions module. We are not importing arcpy here because we want the tool to be runnable even when arcpy is not available and that is why we defined the auxiliary function for testing its availability in core_functions.py. In addition, we are including some comments to define sections within the script for different purposes. We will fill in the code for these sections step-by-step in the following steps. At the very end, we already have the by-now-familiar code for showing the main window and starting the event processing loop of our application (even though we are not creating the application and main window objects yet).
import sys, csv from PyQt5.QtWidgets import QApplication, QMainWindow, QStyle, QFileDialog, QDialog, QMessageBox, QSizePolicy from PyQt5.QtGui import QStandardItemModel, QStandardItem, QDoubleValidator, QIntValidator from PyQt5.QtCore import QVariant from PyQt5.Qt import Qt try: from PyQt5.QtWebEngineWidgets import QWebEngineView as WebMapWidget except: from PyQt5.QtWebKitWidgets import QWebView as WebMapWidget import gui_main import gui_newshapefile import core_functions # ======================================= # GUI event handler and related functions # ======================================= #========================================== # create app and main window + dialog GUI # ========================================= #========================================== # connect signals #========================================== #================================== # initialize global variables #================================== #============================================ # test availability and if run as script tool #============================================ #======================================= # run app #======================================= mainWindow.show() sys.exit(app.exec_())
You may be wondering what is happening in lines 8 to 10. The reason for the try-except construct there is the web view widget we are using in the "Results" part of the GUI to display a Leaflet-based web map of the results. There have been some changes with regard to the web view widget over the last versions of QT5 with the old class QWebView becoming deprecated and a new class QWebEngineView being added to replace it. The purpose of the code is to use QWebEngineView if it is available (meaning the code is run with a newer version of PyQt5) and otherwise fall back to using QWebView. The alias WebMapWidget is used to make sure that in both cases the imported class is available under the same name.