使用PyQt5写python代码读取字典中的key以及key里面嵌套的key,将其设置为子节点和下一子节点(value不包括在子节点里),形成复选框可以自由选择并生成图形化界面
时间: 2024-05-03 19:20:16 浏览: 122
好的,让我来回答您的问题。首先,您可以使用Python内置的json库来读取字典中的键和值。将字典中的键作为子节点添加到树形结构中,然后使用递归函数遍历字典中的值,并将其中的子字典设置为子节点,在每个节点处添加复选框即可实现图形化界面。
以下是实现该功能的示例代码:
```python
import json
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTreeWidget, QTreeWidgetItem, QCheckBox
class DictTree(QTreeWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setHeaderLabels(['Key', 'Value'])
self.__checkbox_dict = {}
self.itemDoubleClicked.connect(self.__on_item_double_clicked)
def load_dict(self, dct):
self.clear()
root = QTreeWidgetItem(self, [str(dct)])
self.build_tree(root, dct)
def build_tree(self, parent, dct):
if not isinstance(dct, dict):
return
for key, value in dct.items():
item = QTreeWidgetItem(parent, [str(key)])
self.__checkbox_dict[id(item)] = QCheckBox(self)
self.setItemWidget(item, 0, self.__checkbox_dict[id(item)])
parent.addChild(item)
self.build_tree(item, value)
def get_selected_items(self):
items = []
for widget_id, checkbox in self.__checkbox_dict.items():
if checkbox.isChecked():
item = self.itemAt(self.visualItemRect(self.itemFromId(widget_id)).center())
items.append(item)
return items
def __on_item_double_clicked(self, item, column):
for i in range(item.childCount()):
child = item.child(i)
self.__checkbox_dict[id(child)].setChecked(self.__checkbox_dict[id(item)].isChecked())
```
以上是自定义的QTreeWidget部分,您可以根据您的需求进行修改。接下来是主要的代码逻辑:
```python
def read_dict_file(file_path):
with open(file_path, 'r') as f:
data = json.load(f)
return data
def main():
app = QApplication([])
widget = QWidget()
layout = QVBoxLayout(widget)
tree = DictTree(widget)
layout.addWidget(tree)
dct = read_dict_file('example.json')
tree.load_dict(dct)
widget.show()
app.exec_()
if __name__ == '__main__':
main()
```
在示例代码中,`example.json`是一个字典类型的JSON文件,您可以替换为您的字典文件路径。它将显示一个包含所有键的树形结构,可以展开和收起嵌套的子项,并在每个节点处添加复选框以进行选择。`get_selected_items`方法将返回当前选定的所有节点。
阅读全文