'PYQT5 - How to Display a QtableWidget on the current page after pressing a button

I'm trying to do an GUI with python, i'm in a difficult part for me. I'm working with json file too.

Today, i have a normal Qtable visible with 9 ColumnHeader and i insert row with informations of my json, but i want to change that with a qtable created after my first test.

(Important think: When i say dynamically Qtable, it's because : 1) I have no information in row at first (this is working), 2) my ColumnHeaderItem = have to be keys of my json file, no key available when i create my json) During actions, i stay in the same page "display-table"

First, i want to join my page "display-table" when i press a button (is working). In this page i don't want to see my Qtable because she have no information yet, row and column.

Second, i launch a test procedure, i write in my json data and keys, keys are available for my Qtable ColumnHeaderItem and test informations for rows. (Keys looks like : LNA, Filter, Frequency Min....i have 9 keys).

Actions : -Press button =>

 def json_creation(self):
        """
        Json Création 
        """

        parameters_projet = {
            "user": self.user,
            "project": self.project,
            "site": self.site,
            "Test": []

        }
        #Opening + writing
        with open('./data/' + self.user + '_' + self.project + '_' + self.site + '.json', 'w') as file:
            json_pjt = json.dumps(parameters_projet)
            file.write(json_pjt + "\n")
            # Ajoute du bouton Link, visualisation de la pop up data
            self.b_link = QtWidgets.QPushButton(self.centralwidget)
            self.b_link.setText("Open data")
            # Désactivé car 0 test
            self.b_link.isEnabled()
            file.close()


        with open('./data/' +self.user + '_' + self.project + '_' + self.site + '.json', 'r') as file:
            self.dataTab = []
            self.jsonlist = json.load(file)
            self.dataTab = self.jsonlist['Test']
            print (self.jsonlist)


        self.display_table()

go to "display-table" a blank page with a button for launching test =>


 def display_table(self):
       
        self.centralwidget = QtWidgets.QWidget(self)

        self.menu_bar()
        self.frame_ihm()

        self.frame_disp = QtWidgets.QFrame(self.centralwidget)
        self.frame_disp.setGeometry(QtCore.QRect(0, 100, 1100, 40)

        self.newtest = QtWidgets.QPushButton(self.centralwidget)
        self.newtest.setGeometry(QtCore.QRect(1135, 300, 120, 50))
        self.newtest.setText("Launch test")
        self.newtest.clicked.connect(self.pop_up_parameters_acq)

        self.setCentralWidget(self.centralwidget)

use this button for launch a test => Write and Read my json =>

def json_edit(self):

        self.lnapick = self.cb_lna.currentText()
        self.filterpick = self.cb_filter.currentText()
        self.polarpick = self.cb_polar.currentText()
        self.azimuthpick = self.spin_azimuth.value()
        self.acq_datetime = datetime.now().strftime("%d-%m-%Y %H:%M")

        self.deckfreq = []
        self.deckamp = []

        # 461 valeurs, ordre croissant
        for _ in range(461):
            self.deckfreq.append(random.randint(0, 25400))
        for _ in range(461):
            self.deckamp.append(random.randint(0, 100))

        # Ordre des valeurs aléatoires ex : 76,543,6,21890,4,67
        self.randfreq = random.shuffle(self.deckfreq)
        self.randamp = random.shuffle(self.deckamp)

        # Valeur min et max en fréquence
        self.freq_min = min(self.deckfreq)
        self.freq_max = max(self.deckfreq)

        # Ouverture json, lecture
        with open('./data/' + self.user + '_' + self.project + '_' + self.site + '.json', 'r') as f:
            parameters_projet = json.load(f)

            #Création dictionnaire avec data test
            test = {
                "Index": len(parameters_projet['Test'])+1,
                "Date-Time": self.acq_datetime,
                "Filter": self.filterpick,
                "LNA": self.lnapick,
                "Polarisation": self.polarpick,
                "Azimuth": self.azimuthpick,
                "Frequency min": self.freq_min,
                "Frequency max": self.freq_max,
                "Frequency": self.deckfreq,
                "Amplituds": self.deckamp,
            }

            #ADD information to 'Test'
            parameters_projet['Test'].append(test)


        f = open('./data/' + self.user + '_' + self.project + '_' + self.site + '.json', 'w')
       
        json_pjt = json.dumps(parameters_projet, indent=4)
        f.write(json_pjt)

        with open('./data/' + self.user + '_' + self.project + '_' + self.site + '.json', 'r') as file:
            self.dataTab = []
            self.jsonlist = json.load(file)
            self.dataTab = self.jsonlist['Test']
            print(self.jsonlist)

        self.display_table()

Create(or no), Up and show my Qtable in "display-table" with Column = keys of my json, Row = informations of my json(is already working)

def qtable_acq(self):
   
        self.table_widget = QtWidgets.QTableWidget(self.frame_disp)
        self.table_widget.setGeometry(QtCore.QRect(20, 100, 1100, 400))
        print(self.dataTab)
        print(len(self.dataTab))

        self.table_widget.setColumnCount(10)
        self.table_widget.setVisible(True)


        self.row = self.table_widget.setRowCount(len(self.dataTab))
        #rowProwosition = self.table_widget.rowCount(len(self.))

        i: int = 0

        self.table_widget.setHorizontalHeaderItem(0, QtWidgets.QTableWidgetItem(str("Test #")))
        self.table_widget.setHorizontalHeaderItem(1, QtWidgets.QTableWidgetItem(str("Link")))
        self.table_widget.setHorizontalHeaderItem(2, QtWidgets.QTableWidgetItem(str("Date - Hour")))
        self.table_widget.setHorizontalHeaderItem(3, QtWidgets.QTableWidgetItem(str("Frequency min [MHz]")))
        self.table_widget.setHorizontalHeaderItem(4, QtWidgets.QTableWidgetItem(str("Frequency max [MHz]")))
        self.table_widget.setHorizontalHeaderItem(5, QtWidgets.QTableWidgetItem(str("Polarization")))
        self.table_widget.setHorizontalHeaderItem(6, QtWidgets.QTableWidgetItem(str("Azimuth [°]")))
        self.table_widget.setHorizontalHeaderItem(7, QtWidgets.QTableWidgetItem(str("LNA")))
        self.table_widget.setHorizontalHeaderItem(8, QtWidgets.QTableWidgetItem(str("Filter")))
        self.table_widget.setHorizontalHeaderItem(9, QtWidgets.QTableWidgetItem(str("Comment")))
        self.table_widget.verticalHeader().hide()
        header = self.table_widget.horizontalHeader()
        header.setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(3, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(4, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(5, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(6, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(7, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(8, QtWidgets.QHeaderView.ResizeToContents)
        header.setSectionResizeMode(9, QtWidgets.QHeaderView.Stretch)

        def create_acq_pop_up_callback(index):
            return lambda: self.pop_up_reading_acq(index)


        buttons_open = [QtWidgets.QPushButton(self.table_widget) for _ in range(len(self.dataTab))]
        #self.index = []
        self.filterpick =[]
        self.lnapick = []
        self.azimuthpick = []
        self.polarpick = []
        self.freq = []
        self.amp = []
        self.freq_min= []
        self.freq_max= []
        self.date_test = []


        for test in self.dataTab:
            keys = test.keys()
            self.index = test['Index']
            self.date_test.append(test['Date-Time'])
            self.freq_min.append(test['Frequency min'])
            self.freq_max.append(test['Frequency max'])
            self.filterpick.append(test['Filter'])
            self.lnapick.append(test['LNA'])
            self.azimuthpick.append(test['Azimuth'])
            self.polarpick.append(test['Polarisation'])
            self.freq.append(test['Frequency'])
            print(self.freq[self.index -1])
            self.amp.append(test['Amplituds'])
            buttons_open[self.index-1].setText(str(self.index))
            buttons_open[self.index-1].clicked.connect(create_acq_pop_up_callback(self.index))

            # Ajout des valeurs dans le tableau
            self.table_widget.setItem(i, 0, QtWidgets.QTableWidgetItem(str(self.index)))
            self.table_widget.setCellWidget(i, 1, buttons_open[self.index-1])

            self.table_widget.setItem(i, 2, QtWidgets.QTableWidgetItem(str(self.lnapick[self.index-1])))
            self.table_widget.setItem(i, 3, QtWidgets.QTableWidgetItem(str(self.freq_min[self.index-1])))
            self.table_widget.setItem(i, 4, QtWidgets.QTableWidgetItem(str(self.freq_max[self.index-1])))
            self.table_widget.setItem(i, 5, QtWidgets.QTableWidgetItem(str(self.polarpick[self.index-1])))
            self.table_widget.setItem(i, 6, QtWidgets.QTableWidgetItem(str(self.azimuthpick[self.index-1])))
            self.table_widget.setItem(i, 7, QtWidgets.QTableWidgetItem(str(self.lnapick[self.index-1])))
            self.table_widget.setItem(i, 8, QtWidgets.QTableWidgetItem(str(self.filterpick[self.index-1])))
            i = i + 1

So i really need help for this QTable apparition after pressing button in the same page and add-create automatically my columnHeader

Utility of doing for me a dynamically Qtable it's, if someone want to change the code and add a new key, the Qtable will be automatically updated and added new ColumHeaderItem

Sorry if i'm not really clear with my english

up, show qtable when first test did Today, normal Qtable with colums defined at first and rows inserted with infos i want to see myqtable with column = ['Test].keys() I want automaticélly Qtable and insert like today row when test did

Thank you



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source