Как обновить виджеты в PyQt5?

Нужно запомнить выбранные элементы (чекбоксы) и отрисовать их в следующем виджете (из класса Products_Window в класс Input_Prices_Window ).
Как обновить значения виджета, ведь он уже отрисовался с дефолтными значениями

main.py :

import sys
from os.path import exists
import pandas as pd
import numpy as np
from collections import Counter
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


# File names, window properties, products data
FILE_NAME_PRODUCTS = 'history.csv'
FILE_NAME_EXPENSES = 'expenses.csv'
WINDOW_WIDTH = 1440
WINDOW_HEIGHT = 650

PRODUCTS = {}
for i in range(1, 22):
    PRODUCTS[str(i)] = 0

class Products_Window(QWidget):
    def __init__(self):
        super().__init__()
        self.layout = QGridLayout(self)

        row, column = 1, 0
        for _product in PRODUCTS:
            el = QCheckBox(_product, self)
            PRODUCTS[_product] = el
            if row % 8 ==0 :
                row = 1
                column +=1
            self.layout.addWidget(el, row, column)
            row += 1
# --------------------------------------------> vvvvvvvvvvvvvvvvvvvvvvvv   ...
        self.button_next = QPushButton('ДАЛЕЕ', objectName='button_next')
        self.layout.addWidget(self.button_next, 11, 2)

        self.button_previous = QPushButton('НАЗАД', objectName='button_previous')
        self.layout.addWidget(self.button_previous, 11, 0)


class Input_Prices_Window(QWidget):
    def __init__(self):
        super().__init__()

        self.PRODUCTS_WITH_PRICES = {}
# !!! +++
        self.layout = QGridLayout(self)                             # !!! +++

        row, column = 2, 0
        names = [i for i in PRODUCTS if PRODUCTS[i] == 1]
        self.expenses =  [
            'Имя заказа','Дата', 'Курс евро [Покупка] [₽]', 'Курс евро [Доставка] [₽]',
            'Курс евро [Налоги] [₽]', 'Доставка До [€]', 'Доставка После [€]',
            'Таможня [₽]'
        ]


        scrollArea = QScrollArea(self)
        scrollArea.setObjectName('scrollArea')                             # +++ setObjectName
        scrollAreaWidgetContents = QtWidgets.QWidget()
        scrollAreaWidgetContents.setObjectName('scrollAreaWidgetContents') # +++ setObjectName                            #

        scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        scrollArea.setWidgetResizable(True)
        ScrollGridLayout = QGridLayout(scrollAreaWidgetContents)
        scrollArea.setWidget(scrollAreaWidgetContents)
        self.layout.addWidget(scrollArea, 1, 0, 10, 3)

        # regex for validating users input
        reg_ex_number = QRegExp("([0-9]*[.])?[0-9]+")
        #dont validate date corectness ONLY FORMAT
        reg_ex_date = QRegExp("^[0-3]?[0-9]/[0-3]?[0-9]/(?:[0-9]{2})?[0-9]{2}$")

        for _product in names + self.expenses:
            if _product not in names:
                if _product == 'Дата':
                    el = QLabel(_product)
                    el.setStyleSheet('border: 1px solid #837569;'
                                     'border-radius: 5px;'
                                     'letter-spacing: 2px;'
                                     'font-size: 15px;'
                                     'font-weight: 600;'
                                     'color: #837569;')
                    ScrollGridLayout.addWidget(el, row, column)

                    input_box_price = QLineEdit(self)
                    input_box_price.setPlaceholderText('  Дата [dd/mm/yyyy]')
                    input_validator = QRegExpValidator(reg_ex_date, input_box_price)
                    input_box_price.setValidator(input_validator)
                    ScrollGridLayout.addWidget(input_box_price, row, column+1, 1, 1)
                elif _product == 'Имя заказа':
                    el = QLabel(_product)
                    el.setStyleSheet('border: 1px solid #837569;'
                                     'border-radius: 5px;'
                                     'letter-spacing: 2px;'
                                     'font-size: 15px;'
                                     'font-weight: 600;'
                                     'color: #837569;')
                    ScrollGridLayout.addWidget(el, row, column)

                    input_box_price = QLineEdit(self, placeholderText=' Придумайте имя')

                    ScrollGridLayout.addWidget(input_box_price, row, column+1, 1, 1)
                else:
                    el = QLabel(_product )
                    el.setStyleSheet('border: 1px solid #837569;'
                                     'border-radius: 5px;'
                                     'letter-spacing:2px;'
                                     'font-size: 15px;'
                                     'font-weight: 600;'
                                     'color: #837569;')
                    ScrollGridLayout.addWidget(el, row, column)
                    input_box_price = QLineEdit(self)
                    input_box_price.setPlaceholderText('  Цена')

                    input_validator = QRegExpValidator(reg_ex_number, input_box_price)
                    input_box_price.setValidator(input_validator)
                    ScrollGridLayout.addWidget(input_box_price, row, column+1, 1, 1)
                self.PRODUCTS_WITH_PRICES[_product] = [input_box_price]
            else:
                el = QLabel(_product + ' [€]')
                el.setStyleSheet('border: 1px solid #837569;'
                                 'border-radius: 5px;'
                                 'letter-spacing: 2px;'
                                 'font-size: 15px;'
                                 'font-weight: 600;'
                                 'color: #837569;')
                input_box_price = QLineEdit(self)
                input_box_amount = QLineEdit(self)

                input_box_price.setPlaceholderText('  Цена')
                input_validator = QRegExpValidator(reg_ex_number, input_box_price)
                input_box_price.setValidator(input_validator)

                input_box_amount.setPlaceholderText('  Количество')
                input_validator = QRegExpValidator(reg_ex_number, input_box_amount)
                input_box_amount.setValidator(input_validator)

                ScrollGridLayout.addWidget(el, row, column)
                ScrollGridLayout.addWidget(input_box_price, row, column+1)
                ScrollGridLayout.addWidget(input_box_amount, row, column+2)

                self.PRODUCTS_WITH_PRICES[_product] = [input_box_price,input_box_amount]
            row += 1

        # button for price calculations
        self.button_next = QPushButton('ДАЛЕЕ', objectName='button_next')
        #button for analysis
        self.button_previous = QPushButton('НАЗАД', objectName='button_previous')

        self.layout.addWidget(self.button_next, 11, 2)
        self.layout.addWidget(self.button_previous, 11, 0)

    def update_products(self):

        print('ok')


class Start_Window(QWidget):
    def __init__(self):
        super().__init__()

        self.heading = QLabel('BUSINESS TURTLE', objectName='heading')
        self.heading.setAlignment(QtCore.Qt.AlignCenter)

        self.button_calc = QPushButton('РАСЧЕТ', objectName='button_calc')


        self.layout = QGridLayout(self)
        self.layout.addWidget(self.heading, 1, 0, 1, 3)
        self.layout.addWidget(self.button_calc, 2, 1)


class Base(QWidget):
    def __init__(self):
        super().__init__()
        # Base window parameters
        self.setWindowTitle('Business Turtle')
        self.setObjectName('centralwidget')

        self.current_window = Start_Window()
        self.current_window.button_calc.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(1))

        self.products_window = Products_Window()
        self.products_window.button_next.clicked.connect(self.Update_Products)
        self.products_window.button_previous.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(0))

        self.input_prices_window = Input_Prices_Window()
        self.input_prices_window.button_previous.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(1))
        


        self.stackedWidget = QStackedWidget(self)                    # !!! +++
        self.stackedWidget.addWidget(self.current_window)
        self.stackedWidget.addWidget(self.products_window)
        self.stackedWidget.addWidget(self.input_prices_window)

        self.layout = QVBoxLayout(self)
        self.layout.addWidget(self.stackedWidget)
        self.stackedWidget.setCurrentIndex(0)

    def Update_Products(self):
        '''
        Updating PRODUCTS database
        1 - was checked
        0 - was empty
        Opens Next window
        '''

        for _product in PRODUCTS:
            print(_product, '    ', PRODUCTS[_product].isChecked())
            if PRODUCTS[_product].isChecked():
                PRODUCTS[_product] = 1
            else:
                PRODUCTS[_product] = 0
        print(PRODUCTS)
        self.stackedWidget.setCurrentIndex(2)


StyleSheet = '''
#centralwidget {
    background-color: #1E152A;
}
#heading {
    font-size: 38px;
    color: "#8FE381";
}
#button_calc, #button_next, #button_previous {
    font-size: 30px;
    color: "#837569";
    letter-spacing: 4px;
    border: 4px solid "#FFA9E7";
    border-radius: 20px;
    margin-bottom: 30px;
}
#button_next, #button_previous {
    font-size: 20px;
    border-radius: 15px;
}
#button_calc:hover, #button_next:hover, #button_previous:hover {
    background: #FFA9E7;
    color: #1E152A;
}

QCheckBox {
    border: 1px solid #837569;
    border-radius : 5px;
    letter-spacing: 2px;
    font-size: 15px;
    font-weight: 600;
    color: #837569;
    margin-left: 50%;
    letter-spacing: 2;
    margin-right: 50%;
    padding-top: 5px;
    padding-bottom: 5px;
    margin-bottom: 20px;
}
#scrollArea, #scrollAreaWidgetContents {
    border: 1px solid #837569;
    border-radius: 20px;
    background-color: #1E152A;
}
QLineEdit {
    border: 1px solid #837569;
    border-radius : 5px;
    letter-spacing: 2px;
    font-size: 15px;
    font-weight: 600;
    color: #837569;
    background-color: #1E152A;
}
QLineEdit:focus {
    outline: none !important;
    border: 2px solid #837569;
    border-radius: 5px;
    background-color: #0E051A;
    color: #938579;
}
'''



if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    window = Base()
    window.resize(800, 600)
    window.show()
    sys.exit(app.exec_())

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

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

Попробуйте так:

import sys
from os.path import exists
import pandas as pd
import numpy as np
from collections import Counter
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


# File names, window properties, products data
FILE_NAME_PRODUCTS = 'history.csv'
FILE_NAME_EXPENSES = 'expenses.csv'
WINDOW_WIDTH = 1440
WINDOW_HEIGHT = 650

PRODUCTS = {}
for i in range(1, 22):
    PRODUCTS[str(i)] = 0

class Products_Window(QWidget):
    def __init__(self):
        super().__init__()
        self.layout = QGridLayout(self)

        row, column = 1, 0
        for _product in PRODUCTS:
            el = QCheckBox(_product, self)
            PRODUCTS[_product] = el
            if row % 8 ==0 :
                row = 1
                column +=1
            self.layout.addWidget(el, row, column)
            row += 1
        self.button_next = QPushButton('ДАЛЕЕ', objectName='button_next')
        self.layout.addWidget(self.button_next, 11, 2)

        self.button_previous = QPushButton('НАЗАД', objectName='button_previous')
        self.layout.addWidget(self.button_previous, 11, 0)


class Input_Prices_Window(QWidget):
    def __init__(self):
        super().__init__()

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv       
        self.layout = QGridLayout(self)  
        self.button_next = QPushButton('ДАЛЕЕ', objectName='button_next')
        self.button_previous = QPushButton('НАЗАД', objectName='button_previous')
        
        
    def new_input_prices(self):
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        self.PRODUCTS_WITH_PRICES = {}
        row, column = 2, 0
# ??     names = [i for i in PRODUCTS if PRODUCTS[i] == 1]
        self.names = [i for i in PRODUCTS if PRODUCTS[i].isChecked()]        # +++
        
        self.expenses =  [
            'Имя заказа','Дата', 'Курс евро [Покупка] [₽]', 'Курс евро [Доставка] [₽]',
            'Курс евро [Налоги] [₽]', 'Доставка До [€]', 'Доставка После [€]',
            'Таможня [₽]'
        ]

        scrollArea = QScrollArea(self)
        scrollArea.setObjectName('scrollArea')   
        self.scrollAreaWidgetContents = QtWidgets.QWidget()
        self.scrollAreaWidgetContents.setObjectName('scrollAreaWidgetContents')    

        scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        scrollArea.setWidgetResizable(True)
        ScrollGridLayout = QGridLayout(self.scrollAreaWidgetContents)
        scrollArea.setWidget(self.scrollAreaWidgetContents)
        self.layout.addWidget(scrollArea, 1, 0, 10, 3)

        # regex for validating users input
        reg_ex_number = QRegExp("([0-9]*[.])?[0-9]+")
        #dont validate date corectness ONLY FORMAT
        reg_ex_date = QRegExp("^[0-3]?[0-9]/[0-3]?[0-9]/(?:[0-9]{2})?[0-9]{2}$")

        for _product in self.names + self.expenses:
            #print(f'111 _product: {_product}')         #
            if _product not in self.names:
                #print(f'222 _product: {_product}')     #
                if _product == 'Дата':
                    #print(f'333 _product: {_product}') #
                    el = QLabel(_product)
                    el.setStyleSheet('border: 1px solid #837569;'
                                     'border-radius: 5px;'
                                     'letter-spacing: 2px;'
                                     'font-size: 15px;'
                                     'font-weight: 600;'
                                     'color: #837569;')
                    ScrollGridLayout.addWidget(el, row, column)

                    input_box_price = QLineEdit(self)
                    input_box_price.setPlaceholderText('  Дата [dd/mm/yyyy]')
                    input_validator = QRegExpValidator(reg_ex_date, input_box_price)
                    input_box_price.setValidator(input_validator)
                    ScrollGridLayout.addWidget(input_box_price, row, column+1, 1, 1)
                elif _product == 'Имя заказа':
                    el = QLabel(_product)
                    el.setStyleSheet('border: 1px solid #837569;'
                                     'border-radius: 5px;'
                                     'letter-spacing: 2px;'
                                     'font-size: 15px;'
                                     'font-weight: 600;'
                                     'color: #837569;')
                    ScrollGridLayout.addWidget(el, row, column)

                    input_box_price = QLineEdit(self, placeholderText=' Придумайте имя')

                    ScrollGridLayout.addWidget(input_box_price, row, column+1, 1, 1)
                else:
                    el = QLabel(_product )
                    el.setStyleSheet('border: 1px solid #837569;'
                                     'border-radius: 5px;'
                                     'letter-spacing:2px;'
                                     'font-size: 15px;'
                                     'font-weight: 600;'
                                     'color: #837569;')
                    ScrollGridLayout.addWidget(el, row, column)
                    input_box_price = QLineEdit(self)
                    input_box_price.setPlaceholderText('  Цена')

                    input_validator = QRegExpValidator(reg_ex_number, input_box_price)
                    input_box_price.setValidator(input_validator)
                    ScrollGridLayout.addWidget(input_box_price, row, column+1, 1, 1)
                self.PRODUCTS_WITH_PRICES[_product] = [input_box_price]
            else:
                print(f"{_product} [€]  -- {row} - {column}") #
                el = QLabel(_product + ' [€]')
# !!!                                               #837569 
# !!!                                                vvvvvv
                el.setStyleSheet('border: 1px solid #f00;'
                                 'border-radius: 5px;'
                                 'letter-spacing: 2px;'
                                 'font-size: 15px;'
                                 'font-weight: 600;'
                                 'color: #837569;')
                input_box_price = QLineEdit(self)
                input_box_amount = QLineEdit(self)

                input_box_price.setPlaceholderText('  Цена')
                input_validator = QRegExpValidator(reg_ex_number, input_box_price)
                input_box_price.setValidator(input_validator)

                input_box_amount.setPlaceholderText('  Количество')
                input_validator = QRegExpValidator(reg_ex_number, input_box_amount)
                input_box_amount.setValidator(input_validator)

                ScrollGridLayout.addWidget(el, row, column)
                ScrollGridLayout.addWidget(input_box_price, row, column+1)
                ScrollGridLayout.addWidget(input_box_amount, row, column+2)

                self.PRODUCTS_WITH_PRICES[_product] = [input_box_price, input_box_amount]
            row += 1

        # button for price calculations
        self.button_next = QPushButton('ДАЛЕЕ', objectName='button_next')
# +++ 
        self.button_next.clicked.connect(self.update_products)            # +++
        
        #button for analysis
        self.button_previous = QPushButton('НАЗАД', objectName='button_previous')

        self.layout.addWidget(self.button_next, 11, 2)
        self.layout.addWidget(self.button_previous, 11, 0)

    def update_products(self):
        print('\nok')
        print(*[[k, v] for k, v in PRODUCTS.items() if PRODUCTS[k].isChecked()])
      

class Start_Window(QWidget):
    def __init__(self):
        super().__init__()

        self.heading = QLabel('BUSINESS TURTLE', objectName='heading')
        self.heading.setAlignment(QtCore.Qt.AlignCenter)

        self.button_calc = QPushButton('РАСЧЕТ', objectName='button_calc')

        self.layout = QGridLayout(self)
        self.layout.addWidget(self.heading, 1, 0, 1, 3)
        self.layout.addWidget(self.button_calc, 2, 1)


class Base(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Business Turtle')
        self.setObjectName('centralwidget')

        self.current_window = Start_Window()
        self.current_window.button_calc.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(1))

        self.products_window = Products_Window()
        self.products_window.button_next.clicked.connect(self.Update_Products)
        self.products_window.button_previous.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(0))

        self.input_prices_window = Input_Prices_Window()
        self.input_prices_window.button_previous.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(1))

        self.stackedWidget = QStackedWidget(self)        
        self.stackedWidget.addWidget(self.current_window)
        self.stackedWidget.addWidget(self.products_window)
        self.stackedWidget.addWidget(self.input_prices_window)

        self.layout = QVBoxLayout(self)
        self.layout.addWidget(self.stackedWidget)
        
        self.stackedWidget.setCurrentIndex(0)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    def Update_Products(self):
        '''
        Updating PRODUCTS database
        1 - was checked
        0 - was empty
        Opens Next window
        '''
#
#        for _product in PRODUCTS:
#            print(_product, '    ', PRODUCTS[_product].isChecked())
#            if PRODUCTS[_product].isChecked():
#                PRODUCTS[_product] = 1
#            else:
#                PRODUCTS[_product] = 0
#        print('111\n', PRODUCTS)

        while self.input_prices_window.layout.count() > 0:
            widget = self.input_prices_window.layout.takeAt(0).widget()
#            print(f'widget = {widget}') 
            widget.hide()
            widget.deleteLater()
        
        self.input_prices_window.new_input_prices()
        self.input_prices_window.button_previous.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(1))
        
        self.stackedWidget.setCurrentIndex(2)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


StyleSheet = '''
#centralwidget {
    background-color: #1E152A;
}
#heading {
    font-size: 38px;
    color: "#8FE381";
}
#button_calc, #button_next, #button_previous {
    font-size: 30px;
    color: "#837569";
    letter-spacing: 4px;
    border: 4px solid "#FFA9E7";
    border-radius: 20px;
    margin-bottom: 30px;
}
#button_next, #button_previous {
    font-size: 20px;
    border-radius: 15px;
}
#button_calc:hover, #button_next:hover, #button_previous:hover {
    background: #FFA9E7;
    color: #1E152A;
}

QCheckBox {
    border: 1px solid #837569;
    border-radius : 5px;
    letter-spacing: 2px;
    font-size: 15px;
    font-weight: 600;
    color: #837569;
    margin-left: 50%;
    letter-spacing: 2;
    margin-right: 50%;
    padding-top: 5px;
    padding-bottom: 5px;
    margin-bottom: 20px;
}
#scrollArea, #scrollAreaWidgetContents {
    border: 1px solid #837569;
    border-radius: 20px;
    background-color: #1E152A;
}
QLineEdit {
    border: 1px solid #837569;
    border-radius : 5px;
    letter-spacing: 2px;
    font-size: 15px;
    font-weight: 600;
    color: #837569;
    background-color: #1E152A;
}
QLineEdit:focus {
    outline: none !important;
    border: 2px solid #837569;
    border-radius: 5px;
    background-color: #0E051A;
    color: #938579;
}
'''



if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    window = Base()
    window.resize(800, 600)
    window.show()
    sys.exit(app.exec_())

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

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

→ Ссылка