Как в одном классе использовать переменные из другого класса?
Есть класс с вкладкой, внутри которой находится несколько виджетов, в которых есть кнопка Add.
Я хочу сделать так, чтобы при нажатии на эту кнопку в окно TEST добавлялся этот виджет, однако не знаю как это правильно реализовать.
main.py:
import sys
#from STYLE import *
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
import time
import random
from korzina import Korzina
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("TEST")
vbox = QVBoxLayout(self)
vbox.addWidget(EgorWindow(), 1)
#Создаем QTabWidget для товаров
self.tab = QtWidgets.QTabWidget()
font = QtGui.QFont("Century Gothic", 12)
self.tab.setFont(font)
# Создаем вкладку
self.sales = Sales(self)
self.tab.addTab(self.sales, " 123 ")
#self.tab.setStyleSheet(qssTab)
vbox.addWidget(self.tab, 1)
class EgorWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super(EgorWindow, self).__init__(parent)
self.title = QWidget(self)
self.title.setFixedSize(2000,540)
label = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)
label.setGeometry(QtCore.QRect(0, 0, 2000, 540))
label.setFixedSize(1920, 540)
def openKor(self):
kor = Korzina()
kor.exec_()
#Кнопка корзины
self.button_kor = QtWidgets.QPushButton('TEST')
#self.button_kor.setStyleSheet(StyleSheet_kor)
self.button_kor.setGeometry(1835, 140, 60, 60)
self.button_kor.clicked.connect(openKor)
self.button_kor.setParent(self.title)
class Sales(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.scroll = QScrollArea()
self.scroll.setWidgetResizable(True)
self.setStyleSheet('background-color: #FFFFFF')
layoutV = QVBoxLayout(self)
layoutV.addWidget(self.scroll)
self.widget = QWidget()
self.widget.setStyleSheet('background-color: #e6e6fa')
self.scroll.setWidget(self.widget)
self.gbox = QGridLayout(self.widget)
self.gbox.setContentsMargins(10, 10, 10, 10)
self.gbox.setSpacing(10)
#первый виджет
self.widget1 = QLabel()
self.widget1.setFixedSize(450, 300)
self.widget1.setStyleSheet('background-color: white')
self.childwidget1 = QLabel(self.widget1)
self.childwidget1.setGeometry(0, 275, 450, 25)
self.childwidget1.setStyleSheet("background-color: #c5d0e6; color: black")
self.childwidget1.setFont(QtGui.QFont("Century Gothic", 13))
self.childwidget1.setText("2000")
self.btn1 = QPushButton(self.childwidget1)
#self.btn1.setStyleSheet(StyleSheet_like)
self.btn1.setGeometry(410, 0, 35, 25)
self.btn3 = QPushButton(self.childwidget1)
#self.btn2.setStyleSheet(StyleSheet_buy)
self.btn3.setText('Add')
self.btn3.setFont(QtGui.QFont('Century Gothic', 10))
self.btn3.setGeometry(350, 0, 50, 25)
#Попытка вставить виджет в другой класс
def add(self, parent = None):
gbox1.addWidget(self.widget1, 0,0)
self.btn3.clicked.connect(add)
#второй
self.widget2 = QWidget()
self.widget2.setFixedSize(450,300)
self.widget2.setStyleSheet("background-color: red")
self.childwidget2 = QLabel(self.widget2)
self.childwidget2.setGeometry(0, 275, 450, 25)
self.childwidget2.setStyleSheet("background-color: #c5d0e6; color: black")
self.childwidget2.setFont(QtGui.QFont("Century Gothic", 12))
self.childwidget2.setText("2000")
self.btn1 = QPushButton(self.childwidget2)
#self.btn1.setStyleSheet(StyleSheet_like)
self.btn1.setGeometry(410, 0, 35, 25)
self.btn2 = QPushButton(self.childwidget2)
#self.btn2.setStyleSheet(StyleSheet_buy)
self.btn2.setText('Add')
self.btn2.setFont(QtGui.QFont('Century Gothic', 10))
self.btn2.setGeometry(350, 0, 50, 25)
#третий
self.widget3 = QWidget()
self.widget3.setFixedSize(450,300)
self.widget3.setStyleSheet("background-color: green")
self.childwidget3 = QLabel(self.widget3)
self.childwidget3.setGeometry(0, 275, 450, 25)
self.childwidget3.setStyleSheet("background-color: #c5d0e6; color: black")
self.childwidget3.setFont(QtGui.QFont("Century Gothic", 12))
self.childwidget3.setText("2000")
self.btn1 = QPushButton(self.childwidget3)
#self.btn1.setStyleSheet(StyleSheet_like)
self.btn1.setGeometry(410, 0, 35, 25)
self.btn2 = QPushButton(self.childwidget3)
#self.btn2.setStyleSheet(StyleSheet_buy)
self.btn2.setText('Add')
self.btn2.setFont(QtGui.QFont('Century Gothic', 10))
self.btn2.setGeometry(350, 0, 50, 25)
#четвертый
self.widget4 = QWidget()
self.widget4.setFixedSize(450,300)
self.widget4.setStyleSheet("background-color: blue")
self.childwidget4 = QLabel(self.widget4)
self.childwidget4.setGeometry(0, 275, 450, 25)
self.childwidget4.setStyleSheet("background-color: #c5d0e6; color: black")
self.childwidget4.setFont(QtGui.QFont("Century Gothic", 12))
self.childwidget4.setText("2000")
self.btn1 = QPushButton(self.childwidget4)
#self.btn1.setStyleSheet(StyleSheet_like)
self.btn1.setGeometry(410, 0, 35, 25)
self.btn2 = QPushButton(self.childwidget4)
#self.btn2.setStyleSheet(StyleSheet_buy)
self.btn2.setText('Add')
self.btn2.setFont(QtGui.QFont('Century Gothic', 10))
self.btn2.setGeometry(350, 0, 50, 25)
#пятый
self.widget5 = QWidget()
self.widget5.setFixedSize(450,300)
self.widget5.setStyleSheet("background-color: grey")
self.childwidget5 = QLabel(self.widget5)
self.childwidget5.setGeometry(0, 275, 450, 25)
self.childwidget5.setStyleSheet("background-color: #c5d0e6; color: black")
self.childwidget5.setFont(QtGui.QFont("Century Gothic", 12))
self.childwidget5.setText("2000")
self.btn1 = QPushButton(self.childwidget5)
self.btn1.setGeometry(410, 0, 35, 25)
self.btn2 = QPushButton(self.childwidget5)
self.btn2.setText('Add')
self.btn2.setFont(QtGui.QFont('Century Gothic', 10))
self.btn2.setGeometry(350, 0, 50, 25)
#шестой
self.widget6 = QWidget()
self.widget6.setFixedSize(450,300)
self.widget6.setStyleSheet("background-color: pink")
self.childwidget6 = QLabel(self.widget6)
self.childwidget6.setGeometry(0, 275, 450, 25)
self.childwidget6.setStyleSheet("background-color: #c5d0e6; color: black")
self.childwidget6.setFont(QtGui.QFont("Century Gothic", 12))
self.childwidget6.setText("2000")
self.btn1 = QPushButton(self.childwidget6)
self.btn1.setGeometry(410, 0, 35, 25)
self.btn2 = QPushButton(self.childwidget6)
self.btn2.setText('Add')
self.btn2.setFont(QtGui.QFont('Century Gothic', 10))
self.btn2.setGeometry(350, 0, 50, 25)
#седьмой
self.widget7 = QWidget()
self.widget7.setFixedSize(450,300)
self.widget7.setStyleSheet("background-color: purpule")
self.childwidget7 = QLabel(self.widget7)
self.childwidget7.setGeometry(0, 275, 450, 25)
self.childwidget7.setStyleSheet("background-color: #c5d0e6; color: black")
self.childwidget7.setFont(QtGui.QFont("Century Gothic", 12))
self.childwidget7.setText("2000")
self.btn1 = QPushButton(self.childwidget7)
#self.btn1.setStyleSheet(StyleSheet_like)
self.btn1.setGeometry(410, 0, 35, 25)
self.btn2 = QPushButton(self.childwidget7)
#self.btn2.setStyleSheet(StyleSheet_buy)
self.btn2.setText('Add')
self.btn2.setFont(QtGui.QFont('Century Gothic', 10))
self.btn2.setGeometry(350, 0, 50, 25)
#восьмой
self.widget8 = QWidget()
self.widget8.setFixedSize(450,300)
self.widget8.setStyleSheet("background-color: yellow")
self.childwidget8 = QLabel(self.widget8)
self.childwidget8.setGeometry(0, 275, 450, 25)
self.childwidget8.setStyleSheet("background-color: #c5d0e6; color: black")
self.childwidget8.setFont(QtGui.QFont("Century Gothic", 12))
self.childwidget8.setText("2000")
self.btn1 = QPushButton(self.childwidget8)
#self.btn1.setStyleSheet(StyleSheet_like)
self.btn1.setGeometry(410, 0, 35, 25)
self.btn2 = QPushButton(self.childwidget8)
#self.btn2.setStyleSheet(StyleSheet_buy)
self.btn2.setText('Add')
self.btn2.setFont(QtGui.QFont('Century Gothic', 10))
self.btn2.setGeometry(350, 0, 50, 25)
#Добавляем виджеты в layout
self.gbox.addWidget(self.widget1, 0, 0)
self.gbox.addWidget(self.widget2, 0, 1)
self.gbox.addWidget(self.widget3, 0, 2)
self.gbox.addWidget(self.widget4, 0, 3)
self.gbox.addWidget(self.widget5, 1, 0)
self.gbox.addWidget(self.widget6, 1, 1)
self.gbox.addWidget(self.widget7, 1, 2)
self.gbox.addWidget(self.widget8, 1, 3)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(1920, 1040)
w.show()
sys.exit(app.exec_())
korzina.py:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
#from main2 import LoginForm
#from main_window1 import TShort
class Korzina(QtWidgets.QDialog):
def __init__(self, parent=None):
super(Korzina, self).__init__(parent)
# Create Login Window
self.setWindowTitle("Корзина")
self.setWindowIcon(QIcon("Корзина.png"))
self.setWindowFlags(Qt.WindowCloseButtonHint | Qt.MSWindowsFixedSizeDialogHint)
self.setFixedSize(1800, 750)
self.scroll = QScrollArea()
self.scroll.setWidgetResizable(True)
self.setStyleSheet('background-color: rgba(230, 230, 250, 1)')
layoutV = QVBoxLayout(self)
layoutV.addWidget(self.scroll)
self.widget = QWidget()
self.widget.setStyleSheet('background-color: #c5d0e6')
self.scroll.setWidget(self.widget)
self.gbox1 = QGridLayout(self.widget)
"""
button_delete = QPushButton(self)
button_delete.setStyleSheet(StyleSheet_1)
button_delete.setText('Delete')
button_delete.setGeometry(1675, 685, 60, 60)
def Buy(self):
buy = LoginForm()
buy.exec_()
button_buy = QPushButton(self)
button_buy.setStyleSheet(StyleSheet_1)
button_buy.setText('Купить')
button_buy.setGeometry(1740, 685, 60, 60)
button_buy.clicked.connect(Buy)
"""
StyleSheet_1 = '''
/* настройка кнопки при статике */
QPushButton {
background-color: #c5d0e6;
border-radius: 30px;
font-size:15px;
font-family: Century Gothic;
}
/* настройка кнопки при наведении */
QPushButton:hover {
background-color: #c5d0e6;
}
/* настройка кнопки при активе */
QPushButton:pressed {
background-color: #c5d0e6;
}
'''
if __name__ == '__main__':
aplicacion = QApplication(sys.argv)
aplicacion.setFont(QtGui.QFont("Century Gothic", 10))
Window = Korzina()
Window.show()
sys.exit(aplicacion.exec_())
Данный виджет я пытаюсь добавить в окно:
Окно в которое должен добавляться виджет:
Ответы (2 шт):
В классе, из которого нужно получить виджет, нужно добавить метод, который возвращает обьект, который нужно получить. Вот пример:
# Класс, из которого мы получаем обьект
class Source:
foo = 0
def ReturnFoo():
return foo
# Класс, в который мы получаем обьект
src = Source()
class Receiver:
buz = src.ReturnFoo()
Я не совсем понял логику написанного вами приложения, поэтому переписал ее чтобы приложение выполняло действия, описанные в теле вашего вопроса:
Есть класс с вкладкой, внутри которой находится несколько виджетов, в которых есть кнопка
Addи я хочу сделать так, чтобы при нажатии на эту кнопку в окноTESTдобавлялся этот виджет.
Обратите внимание что я убрал класс EgorWindow(), т.к. не понял зачем он нужен.
Вы не можете просто так показать один и тотже виджет в разных местах приложения. Для того, чтобы показать аналогичный уже существующему виджету, виджет и показать его в другом месте - вам надо создать НОВЫЙ объект, аналог того существующего виджета и уже этот НОВЫЙ виджет размещать куда вам надо.
Просто скопируйте мои два модуля и запустите main.py и понажимайте на кнопки, наблюдая что происходит. Потом потихоньку смотрите какие изменения я внес в приложение.
main.py
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
from korzina import Korzina
class Widget(QWidget):
def __init__(self, text, background, url, flag):
super().__init__()
self.setFixedSize(450, 300)
self.grid = QGridLayout(self)
self.grid.setContentsMargins(0, 0, 0, 0)
lblImagr = QLabel()
lblImagr.setAlignment(Qt.AlignCenter)
lblImagr.setStyleSheet(f'background-color: {background};')
if url:
lblImagr.setPixmap(QtGui.QPixmap(url).scaled(446, 265, Qt.KeepAspectRatio))
self.lblText = QLabel(text)
if flag:
self.btnAdd = QPushButton('Add')
self.btnDel = QPushButton('???')
self.btnAdd.setEnabled(True)
self.btnDel.setEnabled(False)
else:
self.btnAdd = QPushButton('Купить')
self.btnDel = QPushButton('Delete')
self.btnAdd.setEnabled(True)
self.btnDel.setEnabled(True)
self.grid.addWidget(lblImagr, 0, 0, 1, 3)
self.grid.addWidget(self.lblText, 1, 0)
self.grid.addWidget(self.btnAdd, 1, 1)
self.grid.addWidget(self.btnDel, 1, 2)
class Sales(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.parent = parent
# !!! + vvvvvvvvvvvv
self.widgets = [
('Первый виджет', '#e6e6fa', 'Ok.png', True),
('Второй виджет', 'red', '', True),
('Третий виджет', 'green', '', True),
('Четвертый виджет', 'blue', '', True),
('Пятый виджет', 'grey', '', True),
('Шестой виджет', 'pink', '', True),
('Седьмой виджет', 'purpule', '', True),
('Восьмой виджет', 'yellow', '', True),
]
self.scroll = QScrollArea()
self.scroll.setWidgetResizable(True)
self.setStyleSheet('background-color: #FFFFFF')
layoutV = QVBoxLayout(self)
layoutV.setContentsMargins(10, 10, 10, 10)
layoutV.addWidget(self.scroll)
self.widget = QWidget()
self.scroll.setWidget(self.widget)
self.gbox = QGridLayout(self.widget)
self.gbox.setContentsMargins(0, 0, 0, 0)
self.gbox.setSpacing(5)
column = 4 # хотим разместить эти виджеты в 4 колонки
for step in range(len(self.widgets)):
widget = Widget(*self.widgets[step])
widget.btnAdd.clicked.connect(lambda ch, i=step, w=widget:
self.clicked_btnAdd(i, w))
self.gbox.addWidget(widget, step // column, step % column)
def clicked_btnAdd(self, i, w):
text, background, url, flag = self.widgets[i]
flag = False
# !!! +++
widget = Widget(text, background, url, flag)
self.parent.korzina.korzina_widgets.append(widget)
index = self.parent.korzina.korzina_widgets.index(widget)
self.parent.korzina.listWidget.makeItem(widget)
widget.btnDel.clicked.connect(lambda ch, w=widget:
self.parent.korzina._on_push_button_clicked(w))
widget.btnAdd.clicked.connect(lambda ch, w=widget:
self.parent.korzina._on_push_button_clicked_buy(w))
class MainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("TEST Korzina")
vbox = QVBoxLayout(self)
vbox.setContentsMargins(0, 0, 0, 0)
# ??? self.egorWindow = EgorWindow()
self.korzina = Korzina(self) # !!! +++
vbox.addWidget(self.korzina, 1)
# Создаем QTabWidget для товаров
self.tab = QtWidgets.QTabWidget()
font = QtGui.QFont("Century Gothic", 12)
self.tab.setFont(font)
# Создаем вкладку
self.sales = Sales(self)
self.tab.addTab(self.sales, "Tab Sales")
vbox.addWidget(self.tab, 1)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(1390, 640)
w.show()
sys.exit(app.exec_())
korzina.py
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class ListWidget(QListWidget):
def __init__(self, *args, **kwargs):
super(ListWidget, self).__init__(*args, **kwargs)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setEditTriggers(self.NoEditTriggers)
self.setFlow(self.LeftToRight)
self.setWrapping(True)
self.setResizeMode(self.Adjust)
self.setSpacing(5)
# Резиновая лента (для эффекта выбора рамки)
self._rubberPos = None
self._rubberBand = QRubberBand(QRubberBand.Rectangle, self)
def makeItem(self, lb):
item = QtWidgets.QListWidgetItem(self)
item.setSizeHint(QtCore.QSize(450, 300))
self.setItemWidget(item, lb)
class Korzina(QtWidgets.QWidget): # - QDialog
def __init__(self, parent=None):
super(Korzina, self).__init__(parent)
self.setWindowTitle("Корзина")
self.setWindowIcon(QIcon("Ok.png")) # Корзина.png
self.setMinimumWidth(1410)
# +++
self.korzina_widgets = [] # +++ !!!
self.listWidget = ListWidget() # +
box = QtWidgets.QVBoxLayout(self)
box.setContentsMargins(0, 0, 0, 0)
box.addWidget(self.listWidget)
# метод-обработчик кнопки "Delete"
def _on_push_button_clicked(self, w):
index = self.korzina_widgets.index(w)
# takeItem удаляет итем с виджетом из списка и возвращает его
removed = self.listWidget.takeItem(index)
# удалить из списка
self.korzina_widgets.pop(index)
# метод-обработчик кнопки "Купить"
def _on_push_button_clicked_buy(self, w):
index = self.korzina_widgets.index(w)
w.btnAdd.setText("Продано")
w.btnAdd.setEnabled(False)
w.btnDel.setEnabled(False)
Ok.png




