2015-06-24 5 views
2

Я ищу способ сохранения настроек на устройстве Android от Kivy.Kivy and android sharedpreferences

Я нашел документацию Kivy, общую информацию, неопределенную в этой конкретной области. Он упоминает три метода (извините, не имеют достаточной репутацией, чтобы обеспечить clicable ссылки, относительные пути к kivy.org при условии, я был бы рад, если кто-то может исправить эти ссылки):

  1. [ Хранение] ./docs/api-kivy.storage.html#module-kivy.storage
  2. [Настройки] ./docs/api-kivy.uix.settings.html
  3. [Config] ./docs/api- kivy.config.html

В дополнение к этим, я знаю, что я мог хранить данные в файле, используя pickle или базу данных, но я бы хотел использовать специально sharedpreferences или, по крайней мере, любое постоянное хранилище Android/Kivy.

  1. Однако, мне не удалось найти сравнения или объяснения, как они отличаются друг от друга и как они используются. Может ли кто-нибудь пролить свет, уже использовал их?

  2. На самом деле, я на 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 "сбщ ошибки в", так что в теории они должны были работать, но второй запуск Я получаю те же ошибки. У меня кончились идеи, как взломать ее.

+0

Почему вы сделали 'метод callback' в' метод build' ?? Или это просто проблема с отступом? – kiok46

+0

@ kiok46 нет, это было закрытие, но я реорганизовал его как метод класса, проверил и ошибки сохранялись. –

ответ

1

Kivy.Config используется для хранения настроек, относящихся к созданию класса приложения. Обычно он помещается на самом верху вашего скрипта 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 - это класс хранения, который хранит словарь на диске. Аргумент 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()