我正在寻找一种从Kivy框架中持久存储Android设备上的设置的方法。
我在这一特定领域发现了Kivy文档,整体信息丰富,模糊不清。它提到了三种方法(抱歉,没有足够的声誉提供可引用的链接,提供 kivy.org 的相对路径,如果有人可以修复这些链接,我会很高兴 的):
除此之外,我知道我可以通过pickle或数据库将数据存储在文件中,但我想特别使用sharedpreferences
,或者至少使用任何Android / Kivy特定的持久存储
但是,我无法找到任何比较或解释它们是如何不同的,以及如何使用它们。任何人都可以使用它们吗?
实际上,我80%确定这种方法都没有使用Android的共享首选项,因此我考虑使用jnius(4),为此我尝试过(方法1,2 / 3? ,4),基于简单的hello world示例:
from kivy.app import App
from kivy.uix.button import Button
import jnius
from kivy.config import Config
from kivy.storage.dictstore import DictStore
class MyApp(App):
def build(self):
path = "DEFAULT"
try:
path = Config.get('kivy', 'my_important_variable')
print "\t\t\t KIVY 1:", Config.get('kivy', 'my_important_variable')
except Exception as err:
print ("KIVY, 1, error: {}".format(repr(err)))
try:
store = DictStore("MY_SETTINGS")
path = store.get("my_important_variable")
print "\t\t\t KIVY 2:", path
except KeyError as err:
print ("KIVY, 2, error: {}".format(repr(err)))
try:
prefs_m = jnius.autoclass('android.preference.PreferenceManager')
prefs = prefs_m.getSharedPreferences()
path = prefs.getString("my_important_variable", None)
print "\t\t\t KIVY 3:", path
except jnius.jnius.JavaException as err:
print ("KIVY, 3, error: {}".format(repr(err)))
btn1 = Button(text=path)
btn1.bind(on_press=app.callback) #
return btn1
def callback(self, instance):
print('The button <%s> is being pressed, SAVING...' % instance.text)
try:
Config.set('kivy', 'my_important_variable', "my_value_1")
except Exception as err:
print ("KIVY, 4, error: {}".format(repr(err)))
try:
store = DictStore("MY_SETTINGS")
store.put("MY_SETTINGS", my_important_variable="my_value_2")
except Exception as err:
print ("KIVY, 5, error: {}".format(repr(err)))
try:
prefs_c = jnius.autoclass('android.content.SharedPreferences')
prefs_m = jnius.autoclass('android.preference.PreferenceManager')
prefs = prefs_m.getSharedPreferences()
prefs_e = prefs.Editor()
prefs_e.putString("my_important_variable", "my_value_3")
prefs_e.commit()
except Exception as err:
print ("KIVY, 6, error: {}".format(repr(err)))
try:
context = jnius.autoclass('android.content.Context')
# do I actually get context or a class here?
prefs = context.getPreferences(0).edit();
prefs.putString("my_important_variable", "my_value_4")
prefs.commit()
except Exception as err:
print ("KIVY, 7, error: {}".format(repr(err)))
if __name__ == '__main__':
app = MyApp()
app.run()
这里是logcat的结果
... each time app is launched
I/python ( 5973): KIVY, 1, error: No option 'my_important_variable' in section: 'kivy'
I/python ( 5973): KIVY, 2, error: KeyError('my_important_variable',)
I/python ( 5973): KIVY, 3, error: JavaException('Unable to find a None method!',)
... button pressed
I/python ( 5973): The button <DEFAULT> is being pressed, SAVING...
I/python ( 5973): KIVY, 6, error: JavaException('Unable to find a None method!',)
I/python ( 5973): KIVY, 7, error: AttributeError("type object 'android.content.Context' has no attribute 'getPreferences'",)
请注意,4,5“错误信息”没有被调用,所以理论上他们应该有效,但第二次启动我得到相同的错误。 我已经没有想法如何破解它。
答案 0 :(得分:1)
Kivy.Config用于存储与App类实例化相关的设置。 在导入任何其他kivy模块之前,它通常位于Python脚本的最顶层。 此方法不是特定于平台的,但配置文件的默认路径会根据平台而变化。
from kivy.config import Config
desktop=Config.getint('kivy', 'desktop')
if desktop == 1:
print "This app is being run on a desktop."
DictStore是一个将字典存储到磁盘的存储类。 filename参数指定存储字典的文件的名称。 调用get函数时,将返回Python字典。
from kivy.app import App
from kivy.uix.button import Button
from kivy.storage.dictstore import DictStore
class TestApp(App):
def build(self):
try:
store = DictStore(filename="MY_SETTINGS")
dictionary = store.get("my_important_variable")
print "\t\t\t KIVY 2: DictStore Succeeded",
except KeyError as err:
dictionary = {'name': 'None'}
print ("KIVY, 2, error: {}".format(repr(err)))
self.text = str(dictionary)
btn1 = Button(text=self.text)
btn1.bind(on_press=self.callback) #
return btn1
def callback(self, instance):
print('The button <%s> is being pressed, SAVING...' % instance.text)
try:
store = DictStore(filename="MY_SETTINGS")
store.put("my_important_variable", name="John")
except Exception as err:
print ("KIVY, 5, error: {}".format(repr(err)))
if __name__ == '__main__':
TestApp().run()
我将在下面提供访问共享首选项的代码。 如果您有兴趣了解更多信息,请参阅http://developer.android.com/guide/topics/data/data-storage.html和https://kivy.org/planet/2015/04/python-on%C2%A0android/
from kivy.app import App
from kivy.uix.button import Button
import jnius
class TestApp(App):
def build(self):
try:
PythonActivity = jnius.autoclass('org.renpy.android.PythonActivity')
activity = PythonActivity.mActivity
cntxt = activity.getApplicationContext()
prefs = cntxt.getSharedPreferences("MY_PREFS", cntxt.MODE_PRIVATE )
print "KIVY ACQUIRED SHARED PREFS"
myVar = prefs.getString("my_important_variable", "Default String")
print "\tKIVY 3: Retrieved SharedPref"
except jnius.jnius.JavaException as err:
myVar="Error Loading Prefs."
print ("KIVY, 3, error: {}".format(repr(err)))
self.text = myVar
btn1 = Button(text=self.text)
btn1.bind(on_press=self.callback) #
return btn1
def callback(self, instance):
print('The button <%s> is being pressed, SAVING...' % instance.text)
try:
PythonActivity = jnius.autoclass('org.renpy.android.PythonActivity')
activity = PythonActivity.mActivity
cntxt = activity.getApplicationContext()
prefs = cntxt.getSharedPreferences("MY_PREFS", cntxt.MODE_PRIVATE)
editor = prefs.edit()
editor.putString("my_important_variable", "This is important!")
editor.commit()
print "\tKIVY: Added string <This is important!> to shared prefs."
except Exception as err:
print ("\tKIVY, 6, error: {}".format(repr(err)))
if __name__ == '__main__':
TestApp().run()