客户端服务器程序:如何从JSON提取数据展示在Tkinter GUI?
问题排查与解决方案
1. 先验证JSON文件合法性
手动检查Export.json的语法是否符合标准JSON规范:
- 确保所有键和字符串用双引号包裹(不能用单引号)
- 检查是否有遗漏的逗号、括号不匹配问题
- 中文键名或值是否正常显示无乱码
示例标准JSON结构:
{ "CPU总温度": 45.2, "CPU负载": 18.7, "核心温度": [43.0, 44.1, 42.8, 45.0] }
2. 检查JSON读取代码
确保客户端读取JSON时的逻辑正确,避免编码或键名错误:
import json # 正确读取方式(指定UTF-8编码避免中文乱码) try: with open('Export.json', 'r', encoding='utf-8') as f: sys_data = json.load(f) # 提取数据前先打印验证结构 print("读取到的JSON数据:", sys_data) # 按JSON实际键名提取(注意大小写、拼写完全匹配) cpu_total_temp = sys_data["CPU总温度"] cpu_load = sys_data["CPU负载"] core_temps = sys_data["核心温度"] except FileNotFoundError: print("Export.json文件不存在") except KeyError as e: print(f"JSON中缺少指定键:{e}") except json.JSONDecodeError: print("JSON格式错误,无法解析")
3. 确认服务器端JSON生成逻辑
服务器必须用json.dumps()将字典转为标准JSON字符串发送,禁止直接用str()转换:
import json # 假设已通过OHM获取到数据存入字典 cpu_data = { "CPU总温度": total_temp, "CPU负载": cpu_load, "核心温度": core_temp_list } # 转为带中文支持的JSON字符串 json_str = json.dumps(cpu_data, ensure_ascii=False) # 编码后发送给客户端 client_socket.send(json_str.encode('utf-8'))
如果用str(cpu_data)发送,客户端收到的会是带单引号的非标准格式,直接写入JSON后无法解析。
4. 修复客户端数据接收与写入逻辑
若服务器返回的数据较大,需循环接收避免截断;写入时确保直接写入标准JSON字符串:
# 循环接收完整数据 recv_buffer = b'' while True: chunk = client_socket.recv(1024) if not chunk: break recv_buffer += chunk # 解码为字符串 json_str = recv_buffer.decode('utf-8') # 写入JSON文件(直接写入字符串或转字典后写入均可) with open('Export.json', 'w', encoding='utf-8') as f: # 方式1:直接写入字符串 f.write(json_str) # 方式2:转字典后格式化写入(更安全) # data = json.loads(json_str) # json.dump(data, f, ensure_ascii=False, indent=4)
5. Tkinter展示前的验证
在将数据传入Tkinter组件前,先通过打印确认提取结果,排除GUI渲染干扰:
# 提取数据后先打印 print(f"CPU总温度:{cpu_total_temp}℃,负载:{cpu_load}%") print(f"各核心温度:{core_temps}") # 再更新GUI组件 temp_label.config(text=f"CPU总温度:{cpu_total_temp}℃") load_label.config(text=f"CPU负载:{cpu_load}%")
内容的提问来源于stack exchange,提问作者FletchRFC 20
相关产品推荐
相关产品推荐

