python - 保存 Json 文件
问题描述
我有一个由画布创建的按钮,我想将它的值保存在 json 文件中。将值保存在 json 文件中后,我希望当我再次加载文件时,我选择的按钮默认给我一个凹陷的效果,这样我就可以取消选择它们并尽可能选择它们。当我加载我的 json 文件时,如何给我选择的按钮一个凹陷的效果?
解决方案
我认为最简单的方法是使用 adict
来保存它们,一些更改:
- 我将您的变量修改
toggle=('sunken', 'flat')
为toggle=('flat', 'sunken')
,因为该值可以使用索引,False == 0
,True == 1
。 - 由于 json 不能使用整数作为 key。所以我使用 char。(为了避免
eval()
orexec()
) - 读取 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()
Ps:如果你使用OOP,它会避免使用全局变量。
推荐阅读
- verilog - 在 Verilog 中增加一个变量以索引导线(使用循环)
- python-3.x - 如何关闭 PRAW Reddit 实例?
- reactjs - 出现在组件上方的 Material UI Select 按钮标签
- python - Python函数以挂起的程序结束
- java - Spring Batch如何使用具有其他对象列表的对象持久化到数据库中
- windows - 在 Enclave 中加载 DLL 失败并显示 ERROR_INVALID_IMAGE_HASH
- python - 处理 POST 请求的简单 Python 代理服务器
- html - 以线性梯度作为后备的圆锥梯度
- sml - 冒泡排序实现中的无限循环
- wpf - 将 MainWindowViewModel 中的命令绑定到 UserControl 中的 Slider 值更改事件