繁体   English   中英

试图存储一个对象,但是不能使ttk类处于腌制状态

[英]Attempting to store an object, but cannot pickle ttk class

我正在尝试将文件路径存储到文件,以便在打开应用程序时可以将文件路径重新加载,而不必重新输入。 为此,我尝试使用pickle模块将数据“转储”到文件中。 但是,出现以下错误:

  Traceback (most recent call last):
  File "C:\Program Files\python34\lib\tkinter\__init__.py", line 1533, in __call__
    return self.func(*args)
  File "H:\Documents\Python Scripts\GUI.py", line 71, in <lambda>
    ttk.Button(mainframe, text="Browse", command=lambda:askfile(usbpath)).grid(column=2,row=2,sticky = E)
  File "H:\Documents\Python Scripts\GUI.py", line 26, in askfile
    pickle.dump(pathtype, f)
_pickle.PicklingError: Can't pickle <class 'tkapp'>: attribute lookup tkapp on __main__ failed

我不明白如何避免这种情况。 我的完整代码如下:

#Modules
from tkinter import *
from tkinter import ttk
from tkinter.filedialog import askopenfilename
import pickle
import shutil

#Functions
def popup(info):
    popup = Tk()
    popup.wm_title("Attention")
    popup.attributes("-toolwindow",1)
    label = ttk.Label(popup, text=info)
    label.pack(side="top", fill="x", pady=10)
    ttk.Button(popup, text="OK", command=popup.destroy).pack()
    popup.mainloop()

def stopProg(e):
    root.destroy()
def statuslabel(window, message):
    ttk.Label(window, text=message).grid(column=2, row=1)
def askfile(pathtype):
    filename = askopenfilename(parent=mainframe,title='Choose a file')
    pathtype.set(filename)
    f = open('store.pickle','wb')
    pickle.dump(pathtype, f)
    f.close()

def copyfiles(src,dst):
    sourcefile = src.get()
    if sourcefile.endswith(".txt"):
        try:
            shutil.copy(dst.get(),r'H:\Documents\folder\backups')
            shutil.copy(sourcefile,dst.get())
            statuslabel(mainframe, "Done")
        except IOError:
            statuslabel(mainframe, "Error")
            popup("Error occured: Please check your paths")
    else:
        popup("Bad filetype or no file selected")
#GUI 
root = Tk()
root.title('PPSSPP Save Management')
mainframe = ttk.Frame(root, padding = "3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

try:
    open('store.pickle','x').close()
except FileExistsError:
    statuslabel(mainframe, "Load")

f = open('store.pickle', 'rb')
try:
    usbpath = StringVar()
    usbpath.set(pickle.load(f))
except EOFError:
    usbpath = StringVar()
try:
    homepath = StringVar()
    homepath.set(pickle.load(f))
except EOFError:
    homepath = StringVar()
f.close()

usbpath_entry = ttk.Entry(mainframe,width = 60,textvariable=usbpath)
usbpath_entry.grid(column=1, row=2, sticky=(W,E))
ttk.Label(mainframe, text="USB(PSP) Path").grid(column=1,row=1,sticky=W)
ttk.Button(mainframe, text="Browse", command=lambda:askfile(usbpath)).grid(column=2,row=2,sticky = E)
ttk.Label(mainframe, text="PC (PPSSPP) Path").grid(column=1,row=3,sticky=W)
homepath_entry = ttk.Entry(mainframe,width = 60,textvariable=homepath)
homepath_entry.grid(column=1,row=4, sticky=(W,E))
ttk.Button(mainframe, text="Browse", command=lambda:askfile(homepath)).grid(column=2, row =4,sticky=E)

ttk.Button(mainframe, text="USB -> PC", command=lambda:copyfiles(usbpath,homepath)).grid(column=2,row=5,sticky=(N,S,W,E))
ttk.Button(mainframe, text="PC -> USB", command=lambda:copyfiles(homepath,usbpath)).grid(column=2,row=6,sticky=(N,S,W,E))

此按钮调用askfile并将其发送给StringVar()

ttk.Button(mainframe, text="Browse", command=lambda:askfile(usbpath)).grid(column=2,row=2,sticky = E)

然后该函数尝试对StringVar而不是文件名进行腌制

def askfile(pathtype):  ## pathtype=StrinVar
    ## omitted code
    pickle.dump(pathtype, f)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM