使用tkinter开发文本编辑器时pickle保存报错:无法序列化_tkinter.tkapp对象
解决TypeError: cannot pickle '_tkinter.tkapp' object错误(tkinter文本编辑器保存问题)
错误原因
你当前尝试用pickle.dump(text, ...)直接序列化tkinter的Text组件对象,但tkinter的GUI组件本身无法被pickle序列化——这些对象和底层的_tkinter.tkapp上下文绑定,包含大量无法被序列化的系统资源引用,和多进程无关,单纯是组件对象不支持pickle操作。
解决方案(无需更换pickle模块)
只需要保存Text组件内的文本内容,而非组件对象本身,修改save函数即可:
修改后的save函数
def save(): # 获取文本框内所有内容(从起始位置1.0到末尾) content = text.get("1.0", tk.END) with open('textsave.dat', 'wb') as f: pickle.dump(content, f) # 修复messagebox调用错误:用showinfo而非INFO messagebox.showinfo(title='TextEditor', text='Saved Successfully')
配套加载代码
如果需要读取保存的内容,同样读取pickle中的文本内容后插入到Text组件:
def load(): try: with open('textsave.dat', 'rb') as f: content = pickle.load(f) text.delete("1.0", tk.END) text.insert("1.0", content) except FileNotFoundError: messagebox.showwarning(title='提示', text='未找到保存文件')
替代方案(无需pickle,更简洁)
保存纯文本内容完全可以用普通文件读写,无需pickle:
保存
def save(): content = text.get("1.0", tk.END) with open('textsave.txt', 'w', encoding='utf-8') as f: f.write(content) messagebox.showinfo(title='TextEditor', text='Saved Successfully')
加载
def load(): try: with open('textsave.txt', 'r', encoding='utf-8') as f: content = f.read() text.delete("1.0", tk.END) text.insert("1.0", content) except FileNotFoundError: messagebox.showwarning(title='提示', text='未找到保存文件')
内容的提问来源于stack exchange,提问作者TrapToothpick
相关产品推荐
相关产品推荐

