Отображение в 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]
}
]

