【问题标题】:Kivy porting to iOS. Opening a file works while writing to a file does notKivy 移植到 iOS。写入文件时打开文件无效
【发布时间】:2016-02-12 12:13:56
【问题描述】:

重置保存给出错误消息“IOError: [Errno 9] Bad file descriptor”

def reset_save(self):
    try:
        file = open("./save.txt", "rw+")
    except:
        print("Wrong when saving to file.")
    else:
        for n in self.highscore:
            file.write('0' + '\n')
        self.highscore = [0,0,0,0,0,0,0,0,0,0]
        file.close()

“rw+”从 android 版本的“w”更改,使用“w”打印出“保存到文件时出错”。 android版本使用此代码没有问题。

两个版本的 get_save 都没有问题

def get_save(self):
    try:
        file = open("./save.txt", "r")
    except:
        print("Wrong when opening file.")
    else:
        n = 0
        for line in file:
            self.highscore[n] = float(line)
            n += 1
        file.close()

reset_save用于写入10行零,重置高分列表。

get_save 获取 save.txt 中的行并将它们放入列表中

我使用 kivy 指南从 android 移植到 iOS。它是通过 Xcode 构建的。游戏的其余部分与安卓版本相同。

【问题讨论】:

    标签: python ios file save kivy


    【解决方案1】:

    当您的应用程序可写时,并非所有平台上的所有目录都是可写的。在 iOS 上,所有的应用程序都是沙盒的,应用程序所在的目录是不可写的。但在 Android 上并非如此。 阅读将起作用,因为我猜您正在发送默认的 save.txt 文件。您不应该这样做,如果应用程序启动时不存在,则创建它。

    如果要保存文件,请将其保存在App.user_data_dir。这是您的 reset_save 函数的示例,已重新设计:

    from kivy.app import App
    from kivy.logger import Logger
    from os.path import join
    
    def reset_save(self):
        user_data_dir = App.get_running_app().user_data_dir
        filename = join(user_data_dir, "save.txt")
        try:
             self.highscore = [0] * 10
             with open(filename, "w") as fd:
                 for n in self.highscore:
                     fd.write('0' + '\n')
        except:
             Logger.exception("Cannot reset save file")
    

    【讨论】:

    • 非常感谢!我有一个很小的更正:需要 fd.write('0' + '\n') 而不是 file.write('0' + '\n')。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多