Как получить список из функции всплывающего окна?
Есть главное окно Rep_Orders() на нем кнопки "Select Cols" и "Download".
Кнопка "Select Cols" выводит окно с списком колонок и CheckBox для выбора колонок. Также в этом окне есть две кнопки "Clear" для очистки всех CheckBox и "Select" для получения списка выбранных колонок (функция get_columns() возвращает "cols_list").
Далее этот список нужно передать в функцию dowload_Orders(), которая уже по выбранным колонкам сформирует отчет.
У меня не получается это сделать. Список колонок печатается только в функции get_columns() и далее не передается.
Помогите решить проблему передачи списка колонок cols_list в функцию dowload_Orders().
Всплывающее окно "report_cols_ui.py":
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(308, 407)
self.gridLayout = QtWidgets.QGridLayout(Form)
self.gridLayout.setObjectName("gridLayout")
self.columns_list = QtWidgets.QListWidget(Form)
self.columns_list.setObjectName("columns_list")
self.gridLayout.addWidget(self.columns_list, 0, 0, 1, 1)
self.frame = QtWidgets.QFrame(Form)
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame)
self.horizontalLayout.setObjectName("horizontalLayout")
self.btn_select = QtWidgets.QPushButton(self.frame)
self.btn_select.setMinimumSize(QtCore.QSize(90, 30))
self.btn_select.setMaximumSize(QtCore.QSize(16777215, 30))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/icon/icon/check-circle.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.btn_select.setIcon(icon)
self.btn_select.setObjectName("btn_select")
self.horizontalLayout.addWidget(self.btn_select)
self.btn_clear = QtWidgets.QPushButton(self.frame)
self.btn_clear.setMinimumSize(QtCore.QSize(90, 30))
icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap(":/icon/icon/trash-2.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.btn_clear.setIcon(icon1)
self.btn_clear.setObjectName("btn_clear")
self.horizontalLayout.addWidget(self.btn_clear)
self.gridLayout.addWidget(self.frame, 1, 0, 1, 1)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Columns"))
self.btn_select.setText(_translate("Form", "Select"))
self.btn_clear.setText(_translate("Form", "Clear"))
from wind import resource_rc
Файл с функциями "order.py":
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QWidget, QListWidgetItem
from PyQt5 import QtCore
from sqlalchemy import select
from sqlalchemy.exc import SQLAlchemyError
from db import db, engine
from models import Base_PL, Brands, Contracts, Customers_ALL, Orders, PL_chng, Packs, Products, Stock
from wind.pages.orders_ui import Ui_Form as Ord_Form
from wind.pages.report_cols_ui import Ui_Form as Cols_Form
class Rep_Orders(QWidget):
def __init__(self):
super(Rep_Orders, self).__init__()
self.ui = Ord_Form()
self.ui.setupUi(self)
self.ui.btn_select_cols.setToolTip('выбери колонки для отчета')
self.ui.btn_select_cols.clicked.connect(self.go_to_Select_Cols)
self.ui.btn_download.clicked.connect(self.dowload_Orders)
self.ui.rep_date.setCalendarPopup(True)
def go_to_Select_Cols(self):
self.columns_form = QWidget()
self.columns = Cols_Form()
self.columns.setupUi(self.columns_form)
orders_db = self.get_all_Orders_from_db()
if orders_db.empty == False:
orders_db = orders_db[sorted(orders_db.columns )]
cols = orders_db.columns.values.tolist()
for col in cols:
item = QListWidgetItem(col)
item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
item.setCheckState(QtCore.Qt.Unchecked)
self.columns.columns_list.addItem(item)
self.columns.btn_clear.clicked.connect(self.clear_cols_list)
self.columns_form.show()
self.columns.btn_select.clicked.connect(self.get_columns)
def clear_cols_list(self):
for i in range(self.columns.columns_list.count()):
item = self.columns.columns_list.item(i)
if item.checkState() == QtCore.Qt.Checked:
item.setCheckState(QtCore.Qt.Unchecked)
def get_columns(self):
cols_list = []
for i in range(self.columns.columns_list.count()):
item = self.columns.columns_list.item(i)
if item.checkState() == QtCore.Qt.Checked:
item = item.text()
cols_list.append(item)
self.columns_form.close()
return cols_list
def dowload_Orders(self):
order_data = self.get_all_Orders_from_db()
order_data = order_data[cols_list]
Ответы (1 шт):
Для того чтобы получать быстрые и правильные ответы,
вы должны научиться составлять МИНИМАЛЬНО-ВОСПРОИЗВОДИМЫЙ пример,
который демонстрирует проблему, а не надеяться на чей-то свежий взгляд.
Возможное решение вашей задачи, выглядит примерно так:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(308, 407)
self.gridLayout = QtWidgets.QGridLayout(Form)
self.gridLayout.setObjectName("gridLayout")
self.columns_list = QtWidgets.QListWidget(Form)
self.columns_list.setObjectName("columns_list")
self.gridLayout.addWidget(self.columns_list, 0, 0, 1, 1)
self.frame = QtWidgets.QFrame(Form)
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame)
self.horizontalLayout.setObjectName("horizontalLayout")
self.btn_select = QtWidgets.QPushButton(self.frame)
self.btn_select.setMinimumSize(QtCore.QSize(90, 30))
self.btn_select.setMaximumSize(QtCore.QSize(16777215, 30))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/icon/icon/check-circle.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.btn_select.setIcon(icon)
self.btn_select.setObjectName("btn_select")
self.horizontalLayout.addWidget(self.btn_select)
self.btn_clear = QtWidgets.QPushButton(self.frame)
self.btn_clear.setMinimumSize(QtCore.QSize(90, 30))
icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap(":/icon/icon/trash-2.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.btn_clear.setIcon(icon1)
self.btn_clear.setObjectName("btn_clear")
self.horizontalLayout.addWidget(self.btn_clear)
self.gridLayout.addWidget(self.frame, 1, 0, 1, 1)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Columns"))
self.btn_select.setText(_translate("Form", "Select"))
self.btn_clear.setText(_translate("Form", "Clear"))
#from wind import resource_rc
# +++
class WindowSelectCols(QtWidgets.QWidget, Ui_Form):
def __init__(self):
super(WindowSelectCols, self).__init__()
self.setupUi(self)
self.cols_list = [] # !!! +++
cols = ['1', '2', '3', '4', '5', '6', '7',]
for col in cols:
item = QtWidgets.QListWidgetItem(col)
item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
item.setCheckState(QtCore.Qt.Unchecked)
self.columns_list.addItem(item)
self.btn_clear.clicked.connect(self.clear_cols_list)
self.btn_select.clicked.connect(self.get_columns)
def get_columns(self):
self.cols_list = []
for i in range(self.columns_list.count()):
item = self.columns_list.item(i)
if item.checkState() == QtCore.Qt.Checked:
item = item.text()
self.cols_list.append(item)
print(f'def get_columns(): {self.cols_list}') #
self.hide() # +++
#- return cols_list
def clear_cols_list(self):
for i in range(self.columns_list.count()):
item = self.columns_list.item(i)
if item.checkState() == QtCore.Qt.Checked:
item.setCheckState(QtCore.Qt.Unchecked)
self.cols_list = []
class Rep_Orders(QtWidgets.QWidget):
def __init__(self):
super(Rep_Orders, self).__init__()
self.windowSelectCols = WindowSelectCols() # !!! +++
self.btn_select_cols = QtWidgets.QPushButton('Выбери колонки для отчета')
self.btn_select_cols.setToolTip('Выбери колонки для отчета')
self.btn_select_cols.clicked.connect(self.go_to_Select_Cols)
self.btn_download = QtWidgets.QPushButton('Выполнить dowload_Orders')
self.btn_download.clicked.connect(self.dowload_Orders)
self.layout = QtWidgets.QHBoxLayout(self)
self.layout.addWidget(self.btn_select_cols)
self.layout.addWidget(self.btn_download)
def go_to_Select_Cols(self):
self.windowSelectCols.show() # +++
def dowload_Orders(self):
if self.windowSelectCols.cols_list: # !!! +++
print( # ----------> vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv <--------
f'Колонки для отчета: {self.windowSelectCols.cols_list}')
else:
msg = QtWidgets.QMessageBox.information(
self,
'Внимание',
'Вы не выбрали колонки для отчета.')
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Rep_Orders()
w.show()
sys.exit(app.exec())

