Отображение в Tablewidget значения для выбранного элемента Listwidget

Есть определенный список(файл global_levels.json) - dict{"keys": [list]}:

[{"EURUSD": [1.20158, 1.1954, 1.21567], "GBPUSD": [1.31014, 1.34597, 1.38741 ], "AUDUSD": [0.77, 0.79214, 0.79147], "USDCAD": [1.2741, 1.23145]}].

Далее, на форме есть два виджета: listwidget, отображающий ключи словаря dict:

"EURUSD", "USDCAD"

и tableWidget, отображающий значения (list) для данного ключа:

[1.20158, 1.1954, 1.21567].

Проблема: не получается, выбирая определённый ключ из ListWidget, отобразить соответствующий ему список значений в виджете tableWidget.

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

import sys, loguru
from PyQt5.QtWidgets import (QListWidget, QWidget, QMessageBox,
                             QApplication, QVBoxLayout, QTableWidget, QTableWidgetItem)
from class_json import read_from_json  # для работы с json
from loguru import logger


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        vbox = QVBoxLayout(self)
        listWidget = QListWidget()
        table = QTableWidget()  # Создаём таблицу
        table.setColumnCount(1)     # Устанавливаем три колонки
        table.setRowCount(3)        # и одну строку в таблице

        # new code
        list_a = read_from_json(path_file="files/global_levels.json")  # read levels from json file
        dict_a = list_a[0]
        list_1 = dict_a["EURUSD"]
        list_2 = dict_a["USDCAD"]
        keys = list(dict_a)  # получаем список всех ключей словаря dict_a
        # print(keys[1], type(keys[1]))
        print(f"value from key: {list_1}")

        for key in keys:                                        # -- > заполняем listWidget данными
            listWidget.addItem(key)

        for i in range(len(list_1)):
            table.setItem(0, i, QTableWidgetItem(str(list_1[i])))  # заполняем данными tableWidget


        listWidget.itemDoubleClicked.connect(self.onClicked)    # двойное клик
        listWidget.itemClicked.connect(self.onClick)            # один клик

        vbox.addWidget(listWidget)
        vbox.addWidget(table)
        self.setLayout(vbox)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('QListWidget')
        self.show()

    def onClicked(self, item):
        QMessageBox.information(self, "Info", item.text())

    @logger.catch()
    def onClick(self, item):
        print(f"click : {item.text()}")
        # list_a = read_from_json(path_file="files/global_levels.json")  # read levels from json file
        # dict_a = list_a[0]
        # list_2 = dict_a["USDCAD"]
        # for i in range(len(list_2)):
        #     self.table.setItem(0, i, QTableWidgetItem(str(list_2[i])))  # заполняем данными tableWidget


def main():
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

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

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

Я не знаком с некоторыми библиотеками, которые вы используете, поэтому установил мне известные.

import sys    #, loguru
from PyQt5.QtWidgets import (QListWidget, QWidget, QMessageBox,
    QApplication, QVBoxLayout, QTableWidget, QTableWidgetItem)
# from class_json import read_from_json    # для работы с json
#from loguru import logger

import json                                                               # +++
import chardet                                                            # +++


class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        vbox = QVBoxLayout(self)
        listWidget = QListWidget()
        self.table = QTableWidget()  # Создаём таблицу                     # +++ self.
        self.table.setColumnCount(1) 
        self.table.setRowCount(3)        

        # new code
#        list_a = read_from_json(path_file="files/global_levels.json") 
        list_a = self.loadData("global_levels.json")                       # установите свой путь
        
        self.dict_a = list_a[0]                                            # +++ self.
        list_1 = self.dict_a["EURUSD"]
        list_2 = self.dict_a["USDCAD"]
        keys = list(self.dict_a)  
        # print(keys[1], type(keys[1]))
        print(f"value from key: {list_1}")

        for key in keys:                                      
            listWidget.addItem(key)

        for i in range(len(list_1)):
            self.table.setItem(0, i, QTableWidgetItem(str(list_1[i])))  

        listWidget.itemDoubleClicked.connect(self.onClicked)  # двойное клик
        listWidget.itemClicked.connect(self.onClick)          # один клик

        vbox.addWidget(listWidget)
        vbox.addWidget(self.table)
        self.setLayout(vbox)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('QListWidget')
        self.show()
        
    def loadData(self, path):
        """ Загрузить данные json """
        datas = open(path, 'rb').read()
        datas = datas.decode(chardet.detect(datas).get('encoding', 'utf-8'))
        # self.parseData(json.loads(datas), self)
        #data = json.loads(datas)
        return json.loads(datas)

    def onClicked(self, item):
        QMessageBox.information(self, "Info", item.text())

#    @logger.catch()
    def onClick(self, item):
        print(f"click : {item.text()}")
        # list_a = read_from_json(path_file="files/global_levels.json")  # read levels from json file
        # dict_a = list_a[0]
        # list_2 = dict_a["USDCAD"]
        # for i in range(len(list_2)):
        #     self.table.setItem(0, i, QTableWidgetItem(str(list_2[i])))  # заполняем данными tableWidget

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        _list = self.dict_a.get(item.text(), [])
        [self.table.setItem(0, i, QTableWidgetItem('')) for i in range(self.table.rowCount())]
        for i in range(len(_list)):
            self.table.setItem(0, i, QTableWidgetItem(str(_list[i])))
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


def main():
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
    

global_levels.json

[
    {
        "EURUSD": [1.20158, 1.1954, 1.21567], 
        "GBPUSD": [1.31014, 1.34597, 1.38741 ], 
        "AUDUSD": [0.77, 0.79214, 0.79147], 
        "USDCAD": [1.2741, 1.23145]
    }
]

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

→ Ссылка