首页 > 编程问答 >如何在 kivy 中的应用程序文件中保存和加载设置?

如何在 kivy 中的应用程序文件中保存和加载设置?

时间:2024-07-21 09:18:39浏览次数:7  
标签:python kivy

我一直在使用配置对象来存储和检索 kivy 中应用程序的设置。问题是配置对象是全局的,并且是为系统中的所有 kivy 应用程序设置的。

我当前使用的内容:

from kivy.config import config

...App code

class UserAPP(App);
    def build(self)

    def build_config(self, config)
        config.setdefaults() #multiple key,value pairs


我在 kivy 文档中搜索了执行此操作的方法,也许我在错误的位置或搜索错误的术语。

我的问题是:如何将设置/信息保存到一个文件中,该文件可以在启动时加载并在关闭时保存,该文件是每个应用程序的本地文件?


是的, kivy.config.Config 对象是全局的,这意味着它将被所有 Kivy 应用共享。为了在 Kivy 应用中实现特定于应用的设置,需要使用不同的方法来存储和加载设置数据。以下是一些选项:

1. 使用 Python 内置的 json 模块:

  • 可以使用 json 模块将设置数据序列化为 JSON 字符串,并将该字符串保存到文件中。
  • 当的应用启动时,可以从文件中加载 JSON 字符串,并将其反序列化为 Python 字典。

```python import json

class UserApp(App): def init (self, kwargs): super(). init ( kwargs) self.settings_file = 'user_settings.json' self.load_settings()

   def build(self):
       # ...的应用代码...

   def load_settings(self):
       try:
           with open(self.settings_file, 'r') as f:
               self.settings = json.load(f)
       except FileNotFoundError:
           self.settings = {'username': '', 'theme': 'default'}

   def save_settings(self):
       with open(self.settings_file, 'w') as f:
           json.dump(self.settings, f)

   def on_stop(self):
       self.save_settings()

```

2. 使用 kivy.storage 模块:

  • Kivy 提供了一个 kivy.storage 模块,可以使用它来存储键值对。
  • 此模块提供了不同类型的存储后端,例如 dict json sqllite

```python from kivy.storage.jsonstore import JsonStore

class UserApp(App): def init (self, kwargs): super(). init ( kwargs) self.store = JsonStore('user_settings.json')

   def build(self):
       # ...的应用代码...

   def on_start(self):
       if self.store.exists('username'):
           self.username = self.store.get('username')['value']
       else:
           self.username = 'Guest'

   def on_stop(self):
       self.store.put('username', value=self.username)

```

3. 使用配置文件( .ini 文件):

  • 可以使用 Python 的 configparser 模块来读取和写入 .ini 文件。
  • 这提供了一种结构化的方式来存储的设置。

```python import configparser

class UserApp(App): def init (self, kwargs): super(). init ( kwargs) self.config_file = 'user_settings.ini' self.config = configparser.ConfigParser() self.load_settings()

   def build(self):
       # ...的应用代码...

   def load_settings(self):
       try:
           self.config.read(self.config_file)
       except FileNotFoundError:
           self.config['DEFAULT'] = {'username': '', 'theme': 'default'}
           self.save_settings()

   def save_settings(self):
       with open(self.config_file, 'w') as f:
           self.config.write(f)

   def on_stop(self):
       self.save_settings()

```

选择哪种方法取决于的具体需求和偏好。 json 模块易于使用,而 kivy.storage 模块提供了更多功能和不同的存储后端。 .ini 文件提供了一种更结构化的方式来存储设置,这在处理大量设置时很有用。

标签:python,kivy
From: 62484712

相关文章

  • 我在 Python 时间格式化函数中遇到代码问题
    我一直在研究一个Python函数,将给定的秒数转换为可读的时间格式(HH:MM:SS)。该函数对于大多数测试用例都能正常工作,但对于一些特定的输入会失败。这是我编写的函数:defmake_readable(seconds):ifseconds<60:s1=secondsh1,m1=(0,0)return......
  • 《流畅的Python》第二版 第11章
     fromarrayimportarrayimportmathclassVector2d:__match_args__=('x','y')typecode='d'def__init__(self,x,y):self.__x=float(x)self.__y=float(y)@propertydefx(self)......
  • 《流畅的Python》第二版 第12章
       fromarrayimportarrayimportmathimportfunctoolsimportitertoolsimportoperatorimportreprlibclassVector:typecode='d'def__init__(self,components):self._components=array(self.typecode,components)......
  • 如何在Python中给jupyter单元标准输入?
    我正在尝试在接受用户输入的jupyter笔记本上运行一个程序,但我不知道如何让它读取标准输入。例如,如果我使用shift-enter:a=input()print(a)运行代码,则单元格指示它正在运行,但不接受我的输入。我如何让它接受输入?你遇到的问题是Jupyternotebook中的代码单元默认......
  • Python:如何从 csvreader 列表中删除括号和单引号?
    Pythonn00b在这里。尝试使用csvreader从文件导入数组并打印一个值,但它添加了括号和单引号。这是我的代码:importrandomimportcsvwithopen('crimes.csv','r')ascsvfile:crimes=list(csv.reader(csvfile))hello=["Hello","Greetings","Hi&q......
  • Python 中的多行输入,支持空行并在控制台中检查“\n”
    您好,亲爱的社区,在解决某个竞赛任务时出现了问题。我解决了它,但由于输入棘手而无法交付。我在谷歌上搜索并尝试了几种找到的方法,但如果应用于此任务,它们中的每一种都有一些弱点。而且我无法完全重现所应用的输入,因为它嵌入在竞赛界面中;我可能只依赖描述。这就是为什么我......
  • Python Pandas - 读取 CSV 或 Excel
    我允许用户上传CSV或Excel文件。我正在使用pandas读取文件并创建数据框。由于我无法预测用户将上传哪种文件类型,因此我将pd.read_csv()和pd.read_excel()包装在try/except块中。ifform.validate_on_submit():input_filename=secure_filename(form.file.da......
  • 如何在 python 脚本中调用 robocopy 来批量复制多个文件夹?
    我正在尝试在网络驱动器之间移动多个大文件夹(>10Gb、>100个子文件夹、>2000个文件)。我尝试过在python中使用Shutil.copytree命令,它工作得很好,只是由于不同的原因它无法复制一小部分(<1%的文件)。我相信robocopy对我来说是最好的选择,因为我可以创建一个记录传输过......
  • 如何在Python中使用装饰器动态创建类方法?
    我正在开发一个Python项目,我需要在运行时动态地为类创建方法。我想使用装饰器根据一些外部配置将这些方法添加到类中。要求是:装饰器应该从外部配置(例如字典)读取方法定义。装饰器应该动态地将这些方法添加到类中。每个生成的方法都应具有配置中指定的自己唯一的实现。以......
  • python 中的可扩展视频文件完整性验证
    我的目录包含约100万个视频文件,嵌套在100个子目录下。我想编写一个python脚本来验证这些文件没有损坏,然后删除损坏的文件。做到这一点最有效的方法是什么?它运行的机器有64个cpu核心。当然,以下是如何在Python中构建可扩展视频文件完整性验证器的步骤,该验证器可以......