【问题标题】:Pickle Dictionary not Updating - Python 3.4Pickle 字典未更新 - Python 3.4
【发布时间】:2015-11-05 00:53:18
【问题描述】:

我目前正在尝试让我的程序在用户按下按钮后更新 Pickle 字典中的字符串。每当我尝试更新该字符串时,什么都没有发生。我做错了什么?

保存/加载/默认值:

BACKGROUNDCOLOR = ('#000000')
FOREGROUNDCOLOR = ('#FFFFFF')
default = ('default')
setupcomplete = ('False')


data = {
    'background_color' : BACKGROUNDCOLOR,
    'foreground_color' : FOREGROUNDCOLOR,
    'complete_setup' : setupcomplete,
    'user_name' : default
}

def load():
    print('load')

    with open("./Minetick_Data/datasave", "rb") as f:
        data = pickle.load(f)

def save():
    print('save')

    with open("./Minetick_Data/datasave", "wb") as f:
        pickle.dump(data, f)

def update():
    setupcomplete = 'True'
    save()

这是我尝试更新数据的地方['complete_setup']/setupcomplete:

class ProgramSetup(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        ProgramSetup.configure(self, background = BACKGROUNDCOLOR)


        titleLabel = tk.Label(self, text = "Program Setup", font = TITLE_FONT, background = BACKGROUNDCOLOR, foreground = FOREGROUNDCOLOR)
        finishButton = tk.Button(self, text = "Finish", command = lambda: combine_funcs(update, controller.show_frame(StartPage)))

        titleLabel.pack(padx = 10, pady = 10)
        finishButton.pack(padx = 10)

不过,每当我启动程序时,它都会以默认值启动(假而不是真)

【问题讨论】:

  • 可能是因为您使用的是'False' 而不是False。第一个是字符串,第二个是布尔值。与True 相同。
  • 我没有运行你的代码,但我认为问题是当你运行data = pickle.load(f)时,这一步完全改变了第一个data字典的值。我什至没有在您的摘录中看到正确使用 data 字典。
  • 您是否按下“完成”按钮?
  • 是的,我正在按下“完成”按钮,但它似乎不起作用。该按钮加载下一页并运行 Update() 函数,但不更新字典。
  • 据我所知,您发布的代码中没有任何地方更改data。此外,电话ProgramSetup.configure 似乎很奇怪。这应该是self.configure吗?

标签: python python-3.x tkinter pickle


【解决方案1】:

我会发表评论,但我没有足够的代表。

任何人,我认为我看到的一个问题是:

finishButton = tk.Button(self, text = "Finish", command = lambda: combine_funcs(update, controller.show_frame(StartPage)))

您让finishButton 运行一个名为combine_funcs 的命令(我没有看到为其列出的函数),该命令运行函数update(顺便说一下,它随后调用save)和然后转到StartPage。据我所知,tkinter 按钮本身不能接受多个参数,因此您应该将finishButton 的操作移动到一个函数中,如下所示:

def combine_funcs():
    setupcomplete = 'True'
    print('save')
    with open("./Minetick_Data/datasave", "wb") as f:
        pickle.dump(data, f)
    controller.show_frame(StartPage)

这结合了update 和save 函数,然后将其返回给StartPage。 希望我能帮到一些人。

【讨论】:

  • combine_funcs() 可以在我的 PasteBin 链接上找到:pastebin.com/q44Kz3TN。我以前用过这个功能,它工作得很好。我知道该程序通过两个更新运行,然后显示下一帧。我的字典有问题,没有别的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2017-07-18
相关资源
最近更新 更多