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

如何在不使用pickle库的情况下保存CustomTkinter GUI输入状态

CustomTkinter输入框状态保存与加载实现方案

核心思路

用JSON文件存储输入框的内容列表(因为不能用pickle,JSON是轻量的文本格式,适合存这类结构化数据),启动时读取文件恢复输入框数量和内容。

关键修改点

  1. 修复输入框收集逻辑:原代码里最后一个输入框不在entry_list里,保存时要把entry_list和当前的entry_1都纳入收集范围
  2. 实现保存功能:把所有输入框的值存入JSON文件
  3. 实现加载功能:启动时读取JSON文件,自动创建对应数量的输入框并填充内容

完整代码

import customtkinter
import json
import os

class MyGui:
    def __init__(self, app):
        self.app = app
        self.entry_list = []
        self.save_file = "entries.json"  # 定义保存的文件名

        # 尝试加载之前保存的内容
        self.load_entries()

        # 添加按钮
        self.add_entry_button = customtkinter.CTkButton(master=self.app, text="Add entry", command=self.add_entry)
        self.add_entry_button.pack(pady=10, padx=10)

        self.save_button = customtkinter.CTkButton(master=self.app, text="Save for next session", command=self.save_instance)
        self.save_button.pack(pady=10, padx=10)

    def add_entry(self):
        # 把当前的输入框加入列表(如果是第一次添加,初始的输入框会被加入)
        if hasattr(self, 'entry_1'):
            self.entry_list.append(self.entry_1)
        # 创建新的输入框
        self.entry_1 = customtkinter.CTkEntry(master=self.app, placeholder_text="entry")
        self.entry_1.pack(pady=10, padx=10)

    def save_instance(self):
        # 收集所有输入框的值:列表里的 + 当前最后一个
        entry_values = [entry.get() for entry in self.entry_list]
        if hasattr(self, 'entry_1'):
            entry_values.append(self.entry_1.get())
        # 写入JSON文件
        with open(self.save_file, 'w', encoding='utf-8') as f:
            json.dump(entry_values, f, ensure_ascii=False)

    def load_entries(self):
        # 如果保存文件存在,加载内容
        if os.path.exists(self.save_file):
            with open(self.save_file, 'r', encoding='utf-8') as f:
                entry_values = json.load(f)
            # 创建对应数量的输入框
            for idx, value in enumerate(entry_values):
                entry = customtkinter.CTkEntry(master=self.app, placeholder_text="entry")
                entry.insert(0, value)
                entry.pack(pady=10, padx=10)
                # 除了最后一个,其他都加入entry_list
                if idx != len(entry_values) - 1:
                    self.entry_list.append(entry)
            # 把最后一个输入框赋值给entry_1,方便后续添加新框
            if entry_values:
                self.entry_1 = entry
        else:
            # 没有保存文件时,创建初始输入框
            self.entry_1 = customtkinter.CTkEntry(master=self.app, placeholder_text="entry")
            self.entry_1.pack(pady=10, padx=10)

app = customtkinter.CTk()
running = MyGui(app)
app.mainloop()

说明

  • 保存时:会把所有输入框的内容整理成列表,写入entries.json文件
  • 加载时:启动程序会自动读取entries.json,根据里面的内容创建对应数量的输入框并填充之前保存的值
  • 输入框数量范围:完全支持5-305个的需求,JSON对列表长度没有限制
  • 依赖:只用到Python标准库的json和os,不需要额外安装包

内容的提问来源于stack exchange,提问作者Ravdar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:11:16