Киви и андроид поделились предпочтениями
Я ищу способ для постоянного хранения настроек на устройстве Android, от Kivy Framework.
Я нашел документацию Kivy, в целом информативную, расплывчатую в этой конкретной области. В нем упоминаются три метода (извините, у вас недостаточно репутации для предоставления кликабельных ссылок, указаны относительные пути к kivy.org, я был бы рад, если бы кто-то мог исправить эти ссылки):
- [Storage]./docs/api-kivy.storage.html#module-kivy.storage
- [Настройки]./docs/api-kivy.uix.settings.html
- [Config]./docs/api-kivy.config.html
Кроме того, я знаю, что могу хранить данные в файле, через рассол или базу данных, но я хотел бы использовать специально sharedpreferences
или хотя бы какое-либо постоянное хранилище для Android/Kivy.
Однако я не смог найти ни сравнения, ни объяснения, чем они отличаются и как они используются. Может ли кто-нибудь пролить свет, уже использовал их?
На самом деле, я на 80% уверен, что ни один из этих методов не использует общие настройки Android, поэтому я подумал об использовании jnius (4) и попытался сделать это (методы 1,2/3?,4), основываясь на пример простого привета:
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 "msg об ошибках" не вызывались, поэтому теоретически они должны были работать, но при втором запуске я получаю те же ошибки. У меня закончились идеи, как взломать его.
1 ответ
Kivy.Config используется для хранения настроек, связанных с созданием экземпляров класса App. Обычно он помещается в самый верх вашего скрипта Python, прежде чем импортируется любой другой модуль kivy. Этот метод не зависит от платформы, но путь по умолчанию к файлу конфигурации изменяется в зависимости от платформы.
from kivy.config import Config
desktop=Config.getint('kivy', 'desktop')
if desktop == 1:
print "This app is being run on a desktop."
DictStore - это класс хранения, в котором хранится словарь на диске. Аргумент имени файла указывает имя файла, в котором хранится словарь. Когда вызывается функция 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()