如何将JSON文件指定字段导入Python循环并添加至Listbox
问题与解决方案
需求说明
需要编写for循环,将JSON中的Network Name、Network IP、Subnet、Intermediary Devices、Hosts字段内容添加到标签中,同时把Usable IPs列表内容放入标签下方的Listbox里。
现有资源
JSON数据
{ "networks": [ { "Network Name": "wha", "Network IP": "10.0.1.0", "Subnet": "255.255.255.240", "Usable IPs": [ "10.0.1.1", "10.0.1.2", "10.0.1.3", "10.0.1.4", "10.0.1.5", "10.0.1.6", "10.0.1.7", "10.0.1.8", "10.0.1.9", "10.0.1.10" ], "Intermediary Devices": "1", "Hosts": "9" }, { "Network Name": "newnet", "Network IP": "192.168.0.0", "Subnet": "255.255.255.240", "Usable IPs": [ "192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4", "192.168.0.5", "192.168.0.6", "192.168.0.7", "192.168.0.8", "192.168.0.9", "192.168.0.10" ], "Intermediary Devices": "2", "Hosts": "8" }, { "Network Name": "myNet", "Network IP": "192.168.0.12", "Subnet": "255.255.255.0", "Usable IPs": [ "192.168.0.13", "192.168.0.14", "192.168.0.15", "192.168.0.16", "192.168.0.17", "192.168.0.18", "192.168.0.19", "192.168.0.20" ], "Intermediary Devices": "10", "Hosts": "200" } ] }
原有Python代码
import json import ctypes from tkinter import * from PIL import Image, ImageTk ctypes.windll.shcore.SetProcessDpiAwareness(1) class NetAppHomePG: def __init__(self): self.win = Tk() self.win.geometry("3800x2000") self.win.title("NetApp") self.TabsFrame = Frame(self.win) self.r=0 self.c=1 self.TabsFrame.grid(sticky=W) self.MyNetsCanvas = Canvas(self.TabsFrame, height=1500, width=2500) self.MyNetsCanvas.grid(row=0, rowspan=3, column=1, columnspan=2, pady=200) self.MyNetsFrame = Frame(self.MyNetsCanvas, height=10000, width=500) self.MyNetsCanvas.create_window(0, 0, window=self.MyNetsFrame, anchor=NW) with open("user.json") as f: self.data = json.load(f) self.temp = self.data['networks'] for self.network in self.data['networks']: self.MyNets = Frame(self.MyNetsFrame) self.MyNets.grid(row=self.r, column=self.c, pady=40) if (self.c + 1) % 2 == 0: self.r += 1 self.c = 1 else: self.c += 1 for key, value in self.network.items(): Label(self.MyNets, text=f'{key}: {value}', anchor="w", bg="white", fg="black", font=("Roboto", 14), width=100).grid(padx=150) self.win.mainloop() NetAppHomePG()
修改后的代码
import json import ctypes from tkinter import * ctypes.windll.shcore.SetProcessDpiAwareness(1) class NetAppHomePG: def __init__(self): self.win = Tk() self.win.geometry("3800x2000") self.win.title("NetApp") self.TabsFrame = Frame(self.win) self.r = 0 self.c = 1 self.TabsFrame.grid(sticky=W) self.MyNetsCanvas = Canvas(self.TabsFrame, height=1500, width=2500) self.MyNetsCanvas.grid(row=0, rowspan=3, column=1, columnspan=2, pady=200) self.MyNetsFrame = Frame(self.MyNetsCanvas, height=10000, width=500) self.MyNetsCanvas.create_window(0, 0, window=self.MyNetsFrame, anchor=NW) # 指定要显示为标签的字段 label_fields = ["Network Name", "Network IP", "Subnet", "Intermediary Devices", "Hosts"] with open("user.json") as f: self.data = json.load(f) # 循环处理每个网络,用局部变量避免覆盖实例变量 for network in self.data['networks']: # 创建当前网络的容器Frame net_frame = Frame(self.MyNetsFrame, bd=2, relief="solid", padx=10, pady=10) net_frame.grid(row=self.r, column=self.c, padx=20, pady=40, sticky=N) # 生成指定字段的标签 for field in label_fields: Label(net_frame, text=f"{field}: {network[field]}", anchor="w", bg="white", fg="black", font=("Roboto", 14)).grid(sticky=W, pady=2) # 创建Listbox显示可用IP ip_listbox = Listbox(net_frame, width=30, height=10, font=("Roboto", 12)) ip_listbox.grid(sticky=W, pady=5) # 插入所有可用IP for ip in network["Usable IPs"]: ip_listbox.insert(END, ip) # 更新网格位置 if self.c == 2: self.r += 1 self.c = 1 else: self.c += 1 self.win.mainloop() NetAppHomePG()
关键修改说明
- 指定字段生成标签:定义
label_fields列表,只循环处理需要显示为标签的字段,跳过Usable IPs - 添加Listbox组件:为每个网络创建独立的Listbox,将
Usable IPs中的IP逐个插入 - 优化布局:给每个网络的容器Frame添加边框,调整标签和Listbox的排列,让布局更清晰
- 变量优化:循环中使用局部变量
network替代实例变量self.network,避免循环过程中变量被覆盖 - 网格逻辑简化:直接判断列数是否为2来切换行,逻辑更直观
内容的提问来源于stack exchange,提问作者Willy56
相关产品推荐
相关产品推荐

