Ошибка при добавлении виджета в отдельном потоке PyQt5

Создал интерфейс игры, создал scrollArea, в которой будут карточки (кол-во не известно), шаблон frame (сама карточка, пока упрощал код просто растянул кнопку на весь frame) и кнопку (снизу), при нажатии должно добавляться frame в scrollArea

Я пробовал сделать как здесь но не получилось

https://ru.stackoverflow.com/questions/1139114/pyqt5-%D0%BD%D0%B5-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%8E%D1%82-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-addwidget-%D0%B8-addlayout-%D0%B2-%D0%BE%D1%82%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0%D1%85

Ошибка:

verticalLayout.addWidget(self.card_frame)

NameError: name 'verticalLayout' is not defined

Код:

mian.py

from tool import *
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QLabel, QApplication)
from PyQt5.QtGui import QPixmap


class main_window(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.pushButton.clicked.connect(self.add_new_card)


    #функция для добавления карточки
    def add_new_card(x,c):
        self.card_frame = QtWidgets.QFrame()
        self.card_frame.setMinimumSize(QtCore.QSize(351, 111))
        self.card_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.card_frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.card_frame.setObjectName("card_frame")
        self.verticalLayout.addWidget(self.card_frame)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    myApp = main_window()
    myApp.show()
    sys.exit(app.exec_())

tool.py


# Form implementation generated from reading ui file 'C:\Users\RedZet\Desktop\for_qu.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(411, 501)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.scrollArea_cards = QtWidgets.QScrollArea(self.centralwidget)
        self.scrollArea_cards.setGeometry(QtCore.QRect(10, 40, 391, 381))
        self.scrollArea_cards.setWidgetResizable(True)
        self.scrollArea_cards.setObjectName("scrollArea_cards")
        self.scrollAreaWidgetContents_2 = QtWidgets.QWidget()
        self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 389, 379))
        self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents_2)
        self.verticalLayout.setObjectName("verticalLayout")
        self.crd_lb = QtWidgets.QLabel(self.centralwidget)
        self.crd_lb.setGeometry(QtCore.QRect(10, 10, 47, 13))
        self.crd_lb.setObjectName("crd_lb")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(10, 430, 75, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 411, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        #MainWindow.setTabOrder(self.scrollArea_cards, self.content_card_but)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.crd_lb.setText(_translate("MainWindow", "Cards:"))
        self.pushButton.setText(_translate("MainWindow", "+"))

Ответы (1 шт):

Автор решения: S. Nick

Как вариант:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
#from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QLabel, QApplication)
#from PyQt5.QtGui import QPixmap

#from tool import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(411, 501)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 2, 0, 1, 1)
        self.crd_lb = QtWidgets.QLabel(self.centralwidget)
        self.crd_lb.setObjectName("crd_lb")
        self.gridLayout.addWidget(self.crd_lb, 0, 0, 1, 1)
        self.scrollArea_cards = QtWidgets.QScrollArea(self.centralwidget)
        self.scrollArea_cards.setMinimumSize(QtCore.QSize(120, 120))
        self.scrollArea_cards.setWidgetResizable(True)
        self.scrollArea_cards.setObjectName("scrollArea_cards")
        self.scrollAreaWidgetContents_2 = QtWidgets.QWidget()
        self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 501, 401))
        self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents_2)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.scrollArea_cards.setWidget(self.scrollAreaWidgetContents_2)        
        self.gridLayout.addWidget(self.scrollArea_cards, 1, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 522, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "+"))
        self.crd_lb.setText(_translate("MainWindow", "Cards:"))


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.pushButton.clicked.connect(self.add_new_card)

        self.num = 1

    #функция для добавления карточки
#    def add_new_card(x, c):                                       # ??? x, c
    def add_new_card(self):                                        # + self
        self.card_frame = QtWidgets.QFrame()
        self.card_frame.setMinimumSize(QtCore.QSize(351, 111))
        self.card_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.card_frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.card_frame.setObjectName("card_frame")
        self.card_frame.setStyleSheet('background: #4242ff;')
        
        label = QtWidgets.QLabel(f'{self.num}', self.card_frame)
        label.setAlignment(QtCore.Qt.AlignCenter)
        label.resize(100, 100)
        label.setStyleSheet('background: #ff42ff;')
        self.num += 1
        
#        self.verticalLayout.addWidget(self.card_frame)       
        self.ui.verticalLayout.addWidget(self.card_frame)           # + .ui
      

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    myApp = MainWindow()
    myApp.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка