You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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()

关键修改说明

  1. 指定字段生成标签:定义label_fields列表,只循环处理需要显示为标签的字段,跳过Usable IPs
  2. 添加Listbox组件:为每个网络创建独立的Listbox,将Usable IPs中的IP逐个插入
  3. 优化布局:给每个网络的容器Frame添加边框,调整标签和Listbox的排列,让布局更清晰
  4. 变量优化:循环中使用局部变量network替代实例变量self.network,避免循环过程中变量被覆盖
  5. 网格逻辑简化:直接判断列数是否为2来切换行,逻辑更直观

内容的提问来源于stack exchange,提问作者Willy56

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:45:46