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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:02:10