4

Kivy フレームワークから、Android デバイスに永続的に設定を保存する方法を探しています。

この特定の分野では、全体的に有益で曖昧なKivyのドキュメントが見つかりました。3つの方法について言及しています(申し訳ありませんが、クリック可能なリンクを提供するのに十分な評判がありません。kivy.orgへの相対パスが提供されています。誰かがそれらのリンクを修正できれば幸いです):

  1. [ストレージ] ./docs/api-kivy.storage.html#module-kivy.storage
  2. 【設定】 ./docs/api-kivy.uix.settings.html
  3. [構成] ./docs/api-kivy.config.html

sharedpreferencesそれらに加えて、ピクルまたはデータベースを介してファイルにデータを保存できることを認識していますが、具体的には、または少なくとも Android/Kivy 固有の永続ストレージを使用したいと考えています。

  1. ただし、比較や、それらの違いや使用方法の説明を見つけることができませんでした. すでにそれらを使用していた、誰かが光を当てることができますか?

  2. 実際、この方法のどちらも Android の共有設定を使用していないことは 80% 確信しているので、jnius (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 の「エラーメッセージ」が呼び出されなかったことに注意してください。したがって、理論的には機能するはずですが、2 回目の起動でも同じエラーが発生します。私はそれをクラックする方法のアイデアを使い果たしました。

4

1 に答える 1

2

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をお読みください。 %A0アンドロイド/

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()
于 2016-01-14T04:08:49.563 に答える