Q:

PyQt5 Error Message: 'bool' object has no attribute 'layout_base'

My question seems to be similar to pyQt5 AttributeError: 'bool' object has no attribute 'txtCustCode' but there has been no resolution to that question. 
My situation:
I am building a form from which an administrator can enter information about a new user.   When the info is entered, the admin can press the "submit" button to send the info to the database or press the "cancel" button to clear the form to start fresh. 
So far, I have been able to build the form and display it like I want.   When the "cancel" button is pressed; however, I get the following error message:

Exception "unhandled AttributeError"
'bool' object has no attribute 'layout_base'

I do not understand why I do not get this error message when show_add_new_user_form is called from

self.button_add_user.clicked.connect(self.show_add_new_user_form)

but I do get the error message when it is called from

button_cancel.clicked.connect(self.on_button_cancel_clicked)

or from

button_cancel.clicked.connect(AdminViewTab.show_add_new_user_form)

My files are:
main.py
import sys
from PyQt5.QtWidgets import QApplication
from main_view import MainWindow

class Main(QApplication):

    """    Record keeping application for Vigo Twp Fire Dept.     """

    def __init__(self, sys_argv):
        """        Initializer.         """
        super(Main, self).__init__(sys_argv)
        self.main_view = MainWindow()
        self.main_view.show()

if __name__ == '__main__':
    vigo_main = Main(sys.argv)
    sys.exit(vigo_main.exec_())

main_view.py
from PyQt5.QtWidgets import (QApplication,
                             QMainWindow,
                             QTabWidget,
                             QWidget,
                             QLabel,
                             QHBoxLayout)
from PyQt5.QtCore import (pyqtSlot)
from admin_view import AdminViewTab

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow,self).__init__()
        tabs = QTabWidget()
        tabs.setDocumentMode(True)
        tabs.setTabPosition(QTabWidget. North)
        tabs.setMovable(False)

        self.setWindowTitle("Vigo Township Record Keeping")

        self.tab_user_view = QWidget()
        self.tab_admin_view = AdminViewTab()

        tabs.addTab(self.tab_user_view, 'User Functions')
        tabs.addTab(self.tab_admin_view, 'Administrator Functions')
        self.user_func_view()
        self.setCentralWidget(tabs)

        # Menu
        self.menu = self.menuBar()
        self.file_menu = self.menu.addMenu("File")

    @pyqtSlot()
    def exit_app(self):
        QApplication.quit()

    def user_func_view(self):
        layout = QHBoxLayout()
        label = QLabel("User View Page")
        layout.addWidget(label)
        self.tab_user_view.setLayout(layout)

admin_view.py
from PyQt5.QtWidgets import (QFormLayout,
                             QHBoxLayout,
                             QLabel,
                             QLineEdit,
                             QPushButton,
                             QVBoxLayout,
                             QWidget)
from PyQt5.QtCore import (pyqtSlot)

class AdminViewTab(QWidget):
    def __init__(self, parent=None):
        super(AdminViewTab, self).__init__(parent=parent)

        # Define the base layout
        self.layout_base = QHBoxLayout()

        # Define the layout for the buttons. 
        layout_buttons = QVBoxLayout()

        widget_buttons = QWidget()

        # Following the principle above, I will create a blank widget. 
        # This blank widget will then be populated with the forms needed to
        # complete the admin functions
        widget_work_area = QWidget()

        # Define the buttons for the administrator functions
        self.button_add_user = QPushButton('Add New Personnel', self)
        self.button_update_user = QPushButton('Update Personnel Information')
        self.button_list_roster = QPushButton('List Current Roster')

        # Define the signals for the administrator buttons
        self.button_add_user.clicked.connect(self.show_add_new_user_form)

        # Add the buttons to the buttons layout
        layout_buttons.addWidget(self.button_add_user)
        layout_buttons.addWidget(self.button_update_user)
        layout_buttons.addWidget(self.button_list_roster)

        # add the buttons layout to this widget, for some reason. 
        widget_buttons.setLayout(layout_buttons)

        # Add the widget with the buttons to the base layout
        self.layout_base.addWidget(widget_buttons)

        # Add the work area Widget to the base layout
        self.layout_base.addWidget(widget_work_area)

        self.setLayout(self.layout_base)

    @pyqtSlot()
    def show_add_new_user_form(self):
        # print("This will display the new user form")

        # Remove any widgets that might be in the
        myWidget = self.layout_base.itemAt(1).widget()
        myWidget.setParent(None)
        self.layout_base.removeWidget(myWidget)

        self.layout_base.addWidget(AddNewUserForm())

class AddNewUserForm(QWidget):
    def __init__(self, parent=None):
        super(AddNewUserForm, self).__init__(parent=parent)

        form_layout = QFormLayout()
        form_layout.addRow(QLabel("Personnel Information"))
        form_layout.addRow(QLabel('* Denotes Required Field'))

        call_sign = QLineEdit()
        form_layout.addRow("Call Sign", call_sign)

        button_submit = QPushButton("Submit")
        button_cancel = QPushButton("Cancel")
        form_layout.addRow(button_submit, button_cancel)

        # Connect submit button to submit action in controller
        button_submit.clicked.connect(self.on_button_submit_clicked)

        # Cancel button will clear the form and display a blank form
        # This is essentially the same as when the "add new user" button
        # is pressed initially. 
        # button_cancel.clicked.connect(self.on_button_cancel_clicked)
        button_cancel.clicked.connect(AdminViewTab.show_add_new_user_form)

        self.setLayout(form_layout)

    @pyqtSlot()
    def on_button_submit_clicked(self):
        print("Information Sent to Database")

    @pyqtSlot()
    def on_button_cancel_clicked(self):
        print("Form cleared and reset")
        AdminViewTab.show_add_new_user_form()

Thank you for taking time to assist me with this problem. 

A:

The error is in AdminViewTab.show_add_new_user_form since you are using a class instead of the class instance.  In this case, the clicked signal must be forwarded to another that will connect to the show_add_new_user_form method:
# ...
from PyQt5.QtCore import pyqtSignal, pyqtSlot

class AdminViewTab(QWidget):
    # ...
    @pyqtSlot()
    def show_add_new_user_form(self):
        # print("This will display the new user form")

        # Remove any widgets that might be in the
        myWidget = self.layout_base.itemAt(1).widget()
        myWidget.deleteLater()

        form = AddNewUserForm()
        form.cancelClicked.connect(self.show_add_new_user_form)
        self.layout_base.addWidget(form)

class AddNewUserForm(QWidget):
    cancelClicked = pyqtSignal()

    def __init__(self, parent=None):
        super(AddNewUserForm, self).__init__(parent=parent)
        # ...
        button_submit.clicked.connect(self.on_button_submit_clicked)
        button_cancel.clicked.connect(self.cancelClicked)
        self.setLayout(form_layout)

    # ...

