首页 > 解决方案 > 保存 Json 文件

问题描述

我有一个由画布创建的按钮,我想将它的值保存在 json 文件中。将值保存在 json 文件中后,我希望当我再次加载文件时,我选择的按钮默认给我一个凹陷的效果,这样我就可以取消选择它们并尽可能选择它们。当我加载我的 json 文件时,如何给我选择的按钮一个凹陷的效果?

标签: pythonjsonpython-3.xtkinter

解决方案


我认为最简单的方法是使用 adict来保存它们,一些更改:

  1. 我将您的变量修改toggle=('sunken', 'flat')toggle=('flat', 'sunken'),因为该值可以使用索引,False == 0True == 1
  2. 由于 json 不能使用整数作为 key。所以我使用 char。(为了避免eval()or exec()
  3. 读取 json 文件时,会参考number_canvas_map获取对应画布的值。
import tkinter as tk
import json
from tkinter.filedialog import askdirectory

root = tk.Tk()
root.title('Intialization')


def press(canvas, button_id, toggle=('flat', 'sunken')):
    global selected_value
    # if the original value is True, change it to False.Vice versa
    selected_value[button_id] = not selected_value[button_id]

    # use the index to set the relief False == 0,True == 1.
    canvas.configure(relief=toggle[selected_value[button_id]])
    print(selected_value)


def writeToJSONFile(path, fileName, data):
    filePathNameWExt = path + '/' + fileName + '.json'
    with open(filePathNameWExt, 'w') as fp:
        json.dump(data, fp)


def check():
    global selected_value
    data = {}
    path = askdirectory()
    data['buttons'] = selected_value
    writeToJSONFile(path, 'json', data)


def w():
    window = tk.Toplevel(root)
    window.title('Main')
    global selected_value
    canvas1 = tk.Canvas(window, width=30, height=20, borderwidth=1)
    buttonBG5 = canvas1.create_rectangle(0, 0, 30, 20, outline="", activefill="#F1F1F1")
    buttonTXT5 = canvas1.create_text((15, 10), text="1", font=("Calibri", 8))
    canvas1.tag_bind(buttonBG5, "<ButtonPress-1>", lambda x: press(canvas1, "1"))
    canvas1.tag_bind(buttonTXT5, "<ButtonPress-1>", lambda x: press(canvas1, "1"))
    canvas1.grid(column=2, row=4, sticky='n')
    canvas4 = tk.Canvas(window, width=30, height=20, borderwidth=1)
    buttonBG6 = canvas4.create_rectangle(0, 0, 30, 20, outline="", activefill="#F1F1F1")
    buttonTXT6 = canvas4.create_text((15, 10), text="4", font=("Calibri", 8))
    canvas4.tag_bind(buttonBG6, "<ButtonPress-1>", lambda x: press(canvas4, "4"))
    canvas4.tag_bind(buttonTXT6, "<ButtonPress-1>", lambda x: press(canvas4, "4"))
    canvas4.grid(column=3, row=1, sticky='w')
    canvas3 = tk.Canvas(window, width=30, height=20, borderwidth=1)
    buttonBG7 = canvas3.create_rectangle(0, 0, 30, 20, outline="", activefill="#F1F1F1")
    buttonTXT7 = canvas3.create_text((15, 10), text="3", font=("Calibri", 8))
    canvas3.tag_bind(buttonBG7, "<ButtonPress-1>", lambda x: press(canvas3, "3"))
    canvas3.tag_bind(buttonTXT7, "<ButtonPress-1>", lambda x: press(canvas3, "3"))
    canvas3.grid(column=3, row=2, padx=10)
    canvas2 = tk.Canvas(window, width=30, height=20, borderwidth=1)
    buttonBG8 = canvas2.create_rectangle(0, 0, 30, 20, outline="", activefill="#F1F1F1")
    buttonTXT8 = canvas2.create_text((15, 10), text="2", font=("Calibri", 8))
    canvas2.tag_bind(buttonBG8, "<ButtonPress-1>", lambda x: press(canvas2, "2"))
    canvas2.tag_bind(buttonTXT8, "<ButtonPress-1>", lambda x: press(canvas2, "2"))
    canvas2.grid(column=3, row=3, sticky='w')
    save_config = tk.Button(window, text="Save Configuration", bg='green', command=lambda: check())
    save_config.grid(column=0, row=3, pady=10)
    try:
        number_canvas_map = {
            "1": canvas1,
            "2": canvas2,
            "3": canvas3,
            "4": canvas4
        }
        f = open('json.json', "r")
        j = json.loads(f.read())
        selected_value = j['buttons']
        for i in selected_value:
            press(number_canvas_map[i], i)
    except FileNotFoundError:
        print("No Json File")
    window.grab_set()


load_btn = tk.Button(root, text="Load", command=w)
load_btn.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
root.mainloop()

文件中的json,like(此时已全部按下): 在此处输入图像描述


Ps:如果你使用OOP,它会避免使用全局变量。


推荐阅读