PyQt5读取JSON文件QTextEdit仅展示最后一条记录问题排查
解决QTextEdit仅显示最后一条JSON记录的问题
我猜你大概率是在循环里用了setText()方法更新QTextEdit内容——这个方法会完全覆盖控件里已有的文本,所以循环结束后自然只剩最后一条记录;而控制台的print()是每次追加输出,所以能正常显示所有内容。
咱们来修改你的代码,两种方案任选其一:
方案1:循环中追加文本(推荐)
直接用append()方法(自动添加换行),或者insertPlainText()自定义分隔符:
import json import os from PyQt5.QtWidgets import QTextEdit def displayReport(self, item): searchRes = os.path.join(os.getcwd(), "search_result") path = os.listdir(searchRes) # 先清空文本框(如果需要的话) self.textEdit.clear() try: for file in path: file_path = os.path.join(searchRes, file) with open(file_path, 'r', encoding='utf-8') as f: json_data = json.load(f) # 控制台正常打印 print(json_data) # 用append追加,自动换行,格式化JSON更易读 self.textEdit.append(json.dumps(json_data, indent=4, ensure_ascii=False)) # 或者用insertPlainText自定义分隔,比如加空行分隔不同文件内容 # self.textEdit.insertPlainText(json.dumps(json_data, indent=4, ensure_ascii=False) + '\n\n') except Exception as e: print(f"读取文件出错:{e}")
方案2:先拼接所有内容再一次性设置
如果需要更灵活的内容排版,可以先把所有JSON内容拼接成一个字符串,最后再设置到QTextEdit里:
import json import os from PyQt5.QtWidgets import QTextEdit def displayReport(self, item): searchRes = os.path.join(os.getcwd(), "search_result") path = os.listdir(searchRes) all_content = [] try: for file in path: file_path = os.path.join(searchRes, file) with open(file_path, 'r', encoding='utf-8') as f: json_data = json.load(f) print(json_data) # 把每个文件的JSON格式化后加入列表 all_content.append(json.dumps(json_data, indent=4, ensure_ascii=False)) # 用换行+分隔线拼接所有内容,再设置到文本框 self.textEdit.setText('\n---\n'.join(all_content)) except Exception as e: print(f"读取文件出错:{e}")
额外优化点
用json.dumps(json_data, indent=4, ensure_ascii=False)可以把JSON内容格式化输出,比直接转字符串更易读,还能正常显示中文。
内容的提问来源于stack exchange,提问作者Propy Propy
相关产品推荐
相关产品推荐

