Ошибка при добавлении виджета в отдельном потоке 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 шт):
Как вариант:
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_())
