如何在Python中存储含变量的键值信息?解决多任务存储难题
任务存储APP多任务存储方案问题
我正在开发一款任务存储APP,但无法找到可存储多个任务的有效方案。以下是我当前运行的代码:
def newtaskwin(): newtaskwin=Toplevel(todohome) newtaskwin.geometry() taskbxfrme=tk.Frame(newtaskwin) TaskNameLbl=tk.Label(newtaskwin, text='Task Name:').grid(row=1, column=0, pady=5) TaskNameEntry=ttk.Entry(newtaskwin, width=100) TaskNameEntry.grid(row=1, column=1, pady=5) GroupNameLbl=tk.Label(newtaskwin, text='Group:').grid(row=2, column=0, pady=5) GroupNameEntry=ttk.Entry(newtaskwin, width=100) GroupNameEntry.grid(row=2, column=1, pady=5) PriorityLbl=tk.Label(newtaskwin, text='Priority:').grid(row=3, column=0, pady=5) PriorityEntry=ttk.Entry(newtaskwin, width=100) PriorityEntry.grid(row=3, column=1, pady=5) start_date_lbl=tk.Label(newtaskwin, text='Start Date:').grid(row=4, column=0, pady=5) start_date_entry=ttk.Entry(newtaskwin, width=100) start_date_entry.grid(row=4, column=1, pady=5) end_date_lbl=tk.Label(newtaskwin, text='End Date:').grid(row=5, column=0, pady=5) end_date_entry=ttk.Entry(newtaskwin, width=100) end_date_entry.grid(row=5, column=1, pady=5) start_time_lbl=tk.Label(newtaskwin, text='Start Time:').grid(row=6, column=0, pady=5) start_time_entry=ttk.Entry(newtaskwin, width=100) start_time_entry.grid(row=6, column=1, pady=5) end_time_lbl=tk.Label(newtaskwin, text='End Time:').grid(row=7, column=0, pady=5) end_time_entry=ttk.Entry(newtaskwin, width=100) end_time_entry.grid(row=7, column=1, pady=5) def create_task(): with dbm.open('taskstorage.db' , 'n') as taskdb: taskdb['name']=TaskNameEntry.get() taskdb['Group']=GroupNameEntry.get() taskdb['Priority']=PriorityEntry.get() taskdb['Start_Date']=start_date_entry.get() taskdb['End_Date']=end_date_entry.get() taskdb['Start_Time']=start_time_entry.get() taskdb['end_time']=end_time_entry.get() messagebox.showinfo('eTasks', 'Task saved') create_task_btn=tk.Button(newtaskwin, command=create_task, width=10, text='Save').grid(row=9, column=0)
我尝试过使用json和dbm:json无法存储含变量的字典,dbm会覆盖原有数据,且因Python字典的可变/不可变类型规则,json无法dump数据。
可行的多任务存储解决方案
方案1:使用SQLite3(推荐)
SQLite是轻量级嵌入式数据库,适合本地APP存储结构化数据,支持多任务的增删改查,不会覆盖原有数据。
修改后的代码示例
import sqlite3 from tkinter import messagebox # 初始化数据库表(APP启动时执行一次) def init_db(): conn = sqlite3.connect('tasks.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS tasks (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, group_name TEXT, priority TEXT, start_date TEXT, end_date TEXT, start_time TEXT, end_time TEXT)''') conn.commit() conn.close() # 替换原有的create_task函数 def create_task(): # 获取输入字段内容 task_name = TaskNameEntry.get() group = GroupNameEntry.get() priority = PriorityEntry.get() start_date = start_date_entry.get() end_date = end_date_entry.get() start_time = start_time_entry.get() end_time = end_time_entry.get() # 插入新任务到数据库 conn = sqlite3.connect('tasks.db') c = conn.cursor() c.execute('INSERT INTO tasks (name, group_name, priority, start_date, end_date, start_time, end_time) VALUES (?, ?, ?, ?, ?, ?, ?)', (task_name, group, priority, start_date, end_date, start_time, end_time)) conn.commit() conn.close() messagebox.showinfo('eTasks', 'Task saved')
使用说明
- 在APP启动流程中调用
init_db(),首次运行会自动创建表,后续运行不会重复创建 - 每次点击保存按钮,会向数据库中新增一条任务记录,不会覆盖原有数据
- 后续可轻松扩展任务查询、修改、删除等功能
方案2:使用JSON文件存储任务列表
之前的问题是未用列表存储多任务,而是直接写入单个字典。改为用列表保存所有任务,每次添加时读取原有列表、追加新任务后再写入文件即可。
修改后的代码示例
import json import os from tkinter import messagebox # 替换原有的create_task函数 def create_task(): # 构造新任务字典 new_task = { 'name': TaskNameEntry.get(), 'Group': GroupNameEntry.get(), 'Priority': PriorityEntry.get(), 'Start_Date': start_date_entry.get(), 'End_Date': end_date_entry.get(), 'Start_Time': start_time_entry.get(), 'end_time': end_time_entry.get() } tasks_file = 'tasks.json' # 读取现有任务列表 if os.path.exists(tasks_file): with open(tasks_file, 'r', encoding='utf-8') as f: tasks = json.load(f) else: tasks = [] # 追加新任务并写入文件 tasks.append(new_task) with open(tasks_file, 'w', encoding='utf-8') as f: json.dump(tasks, f, indent=4, ensure_ascii=False) messagebox.showinfo('eTasks', 'Task saved')
使用说明
- 首次保存任务时会自动创建
tasks.json文件 - 每次保存都会读取已有任务列表,追加新任务后整体写入,不会覆盖原有数据
- 读取任务时,直接加载整个JSON文件即可得到所有任务的列表
内容的提问来源于stack exchange,提问作者Minion123
相关产品推荐
相关产品推荐

