【问题标题】:How to keep list changes when program ends?程序结束时如何保持列表更改?
【发布时间】:2017-03-02 03:19:22
【问题描述】:

我做了简单的提交分数选项。用户输入姓名和分数,并将它们保存到列表中。列表仅保存前 10 个分数。比,列表打印到 .txt 文件。但它仅在程序运行时才有效。当我再次启动它时,.txt 文件中只有默认分数。未保存用户分数。为此,我正在使用 pickle 模块。

这是我的一段代码。它是 Python 3.4 和 Tkinter。 请记住,我正在学习 python。

# This is inside class
#  ...
#  ...

    self.printto = tk.Button(self, text="Submit",
                             command=self.highscore
                             )
    self.printto.pack(side="left")

    self.high_scores = [
        ('Liz', 1800)
    ]

def highscore(self):
    name = self.name_ent.get()
    score = int(self.score_ent.get())

    self.high_scores.append((name, score))
    high_scores = sorted(self.high_scores, key=itemgetter(1), reverse=True)[:10]

    with open('D:\Desktop/mytext.txt', 'wb') as f:
        pickle.dump(high_scores, f)

【问题讨论】:

    标签: python windows list tkinter pickle


    【解决方案1】:

    你在寻找这样的东西吗?阅读文本文件中的分数

    user_score = {}
    with open('D:\Desktop/mytext.txt') as f:
        for line in f:
           #add user and score to user_score here
    

    【讨论】:

      【解决方案2】:

      您只是将数据保存到文件中,而不是读取它。您必须在程序开始时打开文件并从中读取分数。

      with open('D:\Desktop/mytext.txt', 'rb') as f:
          high_scores = pickle.load(f)
      

      【讨论】:

      • @pythoner:你已经找到了pickle 模块;您是否检查了该模块并查看了pickle.load() 方法?
      • TypeError: 'str' 不支持缓冲区接口
      • @pythoner:没有回溯,我们无法排除故障。您在需要字节的地方使用 str 对象。
      【解决方案3】:

      几件事 第一件事:你的问题就在这里

      with open('D:\Desktop/mytext.txt', 'wb') as f:
      

      你打开一个文件,不是在追加模式下,而是在创建模式下,所以每次你想往文件里写东西时,你只是覆盖现有的。您可能想先阅读它并与您要写的日期进行比较,以获得前 10 名。

      第二件事: 使用pickle 来保存带有strings/ints 的列表有点矫枉过正。请改用json.dumps/loads

      【讨论】:

      • 你不想添加泡菜。您想使用w 用更新后的列表替换旧列表。 pickle 在这里工作得很好,JSON 是一个不错的选择,但在这里不一定是问题。
      猜你喜欢
      • 1970-01-01
      • 2021-02-15
      • 2021-12-26
      • 2015-03-07
      • 2018-11-23
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多