首页 > 解决方案 > 如何编辑json文件中的列表并将其保存在python中

问题描述

我想制作列表以删除path_choosed = StringVar(). 然后将列表转储到 json 文件中。但是当我尝试使用remove()功能时。我像这样清除它:

前:

["item1",'item2',"item3"]

之后:(它清除文件)

import shutil,os,json,sys
from tkinter import *
from tkinter import filedialog,font as tkfont, messagebox as m_box


rf = open('path.json','r')
fd = json.load(rf)
path_list = fd.copy()
path_list_copy = path_list.copy()
rf.close()

selectedPath = ""
def browse_func(x,y):
    global selectedPath
    try:
        selectedPath = filedialog.askdirectory()
        x.configure(text=selectedPath)
        y.focus_force()
    except Exception as f:
        m_box.showerror('An Error Occured',f)

def add_func():
    global selectedPath,xyz
    try:
        if selectedPath:
            wf = open('path.json','w')
            path_list.append(selectedPath)
            json.dump(path_list,wf)
            restart()
        elif selectedPath == "":
            m_box.showerror("Writing ERROR",'Please type something')
    except Exception as w:
        m_box.showerror('An Error Occured',w)

def add_path_win_func():
    add_win = Toplevel()
    add_win.overrideredirect(True)
    add_win.focus_force()
    add_win.title("Add More Paths")
    add_win.iconbitmap(None)
    lbl1= Label(add_win,text="Choose path To be Add in the list",font=("helvatica",15))
    lbl2=Label(add_win,bg="dark grey",text="",font=("helvatica",14))
    brws_btn = Button(add_win,text='Browse...',font=helv20,command=lambda:browse_func(lbl2,add_win))
    add_btn = Button(add_win,text="Add",command=add_func,font=("helvatica",16))
    Cancel_btn = Button(add_win,text="Cancel",command=lambda:add_win.destroy(),font=("helvatica",16))

    lbl1.grid(row=0,column=0,padx=8,pady=8)
    lbl2.grid(row=1,column=0,pady=8)
    brws_btn.grid(row=1,column=1,pady=8)
    add_btn.grid(row=2,column=0,pady=18,padx=18)
    Cancel_btn.grid(row=2,column=1,pady=18,padx=18)

    add_win.mainloop()

def restart():
    os.startfile('backup.py')
    sys.exit()

def backup_func():
    global src_choosed,dest_choosed
    src = src_choosed.get()
    dest = dest_choosed.get()
    try:
        folder = os.path.basename(src)
        new_dest = str(f"{dest}/{folder}")
        if os.path.exists(new_dest):
            shutil.rmtree(new_dest)
        else:
            None
        shutil.copytree(src,new_dest)
    except Exception as e:
        m_box.showerror("An ERROR Occured",e)

def remove_win():
    
    def remove():
        try:
            wf = open("path.json","w")
            selecItem = path_choosed.get()
            if selecItem=="Select Path":
                m_box.showerror("Can't Remove","You Can Not Remove\nThis")
            elif selecItem == "":
                m_box.showerror("Type ERROR","Please Choose Something")
            elif selectedPath:
                path_list_copy.remove(path_choosed.get())
                json.dump(path_list_copy,wf)
                wf.close()
                restart()
        except Exception as e:
            m_box.showerror("An ERROR Occured",e)

    remo_win = Toplevel()
    remo_win.overrideredirect(True)
    remo_win.focus_force()
    remo_win.title("Add More Paths")
    remo_win.iconbitmap(None)
    lbl1= Label(remo_win,text="Choose path To be Removed in the list",font=("helvatica",15))
    path_choosed = StringVar()
    path_choosed.set(path_list[0])
    Paths = OptionMenu(remo_win,path_choosed,*path_list_copy)
    remo_btn = Button(remo_win,text="Remove",command=remove,font=("helvatica",16))
    Cancel_btn = Button(remo_win,text="Cancel",command=lambda:remo_win.destroy(),font=("helvatica",16))

    lbl1.grid(row=0,column=0,padx=8,pady=8)
    Paths.grid(row=1,column=0,sticky="ew")
    remo_btn.grid(row=2,column=0,pady=18,padx=18)
    Cancel_btn.grid(row=2,column=1,pady=18,padx=18)
    remo_win.mainloop()

win = Tk()
win.resizable(0, 0)
win.iconbitmap("icon.ico")
win.title("Backup Manager")
win.rowconfigure(0,weight=1)
win.columnconfigure(0,weight=1)
helv20 = tkfont.Font(family="futora",size=20,weight=tkfont.BOLD)

#=================Backup Screen====================#
backup_screen = Frame(win,bg="#AFE1AF")
bl1 = Label(backup_screen,font=("verdana",20),text="Choose Source To Be Copied")
src_choosed = StringVar()
src_combo = OptionMenu(backup_screen,src_choosed,*path_list)
src_combo.config(font=helv20)
menu_src = win.nametowidget(src_combo.menuname)
menu_src.config(font=helv20)

dest_choosed = StringVar()
try:
    dest_choosed.set(path_list[0])
    src_choosed.set(path_list[0])
except:
    None
bl2 = Label(backup_screen,font=("verdana",20),text="Choose Destination")

dest_combo = OptionMenu(backup_screen,dest_choosed,*path_list)
dest_combo.config(font=helv20)
menu_dest = win.nametowidget(dest_combo.menuname)
menu_dest.config(font=helv20)

backup_btn = Button(backup_screen,command=backup_func,bg="Green",activebackground="red",text="Back up",width=20,font=("Verdana",15))
path_btn = Button(backup_screen,text="Manage Paths",width=20,
    font=("Verdana",15),command=lambda:mng_path_screen.tkraise())

bl1.grid(row=0,column=0,pady=4)
src_combo.grid(row=1,column=0,sticky="ew",pady=4)
bl2.grid(row=2,column=0,pady=4)
dest_combo.grid(row=3,column=0,sticky="ew",pady=4)
backup_btn.grid(row=4,column=0,pady=4)
path_btn.grid(row=5,column=0,pady=4)

#==================Manage Path==================#
mng_path_screen = Frame(win,bg="#E4D00A")

path_lst_box = Listbox(mng_path_screen,width=50)
path_lst_box.insert(0,*path_list)
add_path_btn = Button(mng_path_screen,command=add_path_win_func,text="Add Path",font=("verdana",16))
removebutton = Button(mng_path_screen,command=remove_win,text="Remove Path",font=("verdana",16))
go_back_btn = Button(mng_path_screen,text="Go Back",command=lambda:backup_screen.tkraise(),font=("verdana",16))

path_lst_box.grid(row=0,column=0,padx=50, pady=6)
add_path_btn.grid(row=1,column=0)
removebutton.grid(row=2,column=0,sticky="w")
go_back_btn.grid(row=2,column=0,sticky="e")

for frame in (backup_screen,mng_path_screen):
    frame.grid(column=0,row=0,sticky="nswe")

backup_screen.tkraise()

win.mainloop()

标签: pythonjsonlisttkinter

解决方案


推荐阅读