Kivy - pyinstaller

Problème avec json storage

ache a marqué ce sujet comme résolu.

Bonjour à tous. Depuis quelques semaines, je me suis mis au développement de gui python avec Kivy. J’arrive bien à l’utiliser et j’en suis content. Cependant, j’essaye maintenant de créer un package pour mon application, pour qu’elle soit utilisable facilement sur MacOSX.

Tout va bien tant que je n’ajoute pas à mon application la possibilité d’enregistrer des données, via le JSON storage de Kivy (très simple à utiliser et parfaitement adapté à mes besoins). Si j’ai uniquement de la logique python avec des fichiers .kv, il n’y a aucun problème. L’application est compilée et se lance parfaitement.

Si j’essaie d’ajouter une interaction avec un fichier store.json pour stocker les données utilisateurs, l’application se compile à nouveau sans problème, mais plante systématiquement au démarrage.

J’ai recréé une petite app test pour montrer cela :

# fichier main.py
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.storage.jsonstore import JsonStore

Builder.load_file('screensmanager.kv')

class HomeScreen(Screen):
    pass


class IndexScreen(Screen):
    pass


class ScreensManager(ScreenManager):
    def __init__(self,  **kwargs):
        super(ScreensManager,  self).__init__(**kwargs)
        self.add_widget(HomeScreen(name="home"))
        self.add_widget(IndexScreen(name="index"))


class PlanningApp(App):
    def build(self):
        store = JsonStore('store.json')
        store.put('test', note='test')
        return ScreensManager()

if __name__ == "__main__":
    PlanningApp().run()
# fichier screensmanager.kv
<HomeScreen>:
    BoxLayout:
        Button:
            text: 'Switch to Index'
            on_press: root.manager.transition.direction = 'left'
                    on_press: root.manager.current = 'index'

<IndexScreen>:
    BoxLayout:
        Button:
            text: 'Switch to Home'
            on_press: root.manager.transition.direction = 'right'
                    on_press: root.manager.current = 'home'
# fichier testapp.spec (utilisé par pyinstaller)
# -*- mode: python -*-

block_cipher = None

a = Analysis(['main.py'],
             pathex=['/Users/leir/Code/testapp'],
             binaries=[],
             datas=[('screensmanager.kv','.'),
                    ('store.json','.')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=['_tkinter', 'Tkinter', 'pyenchant', 'twisted'],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='testapp',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='testapp')
app = BUNDLE(coll,
             name='testapp.app',
             icon=None,
             bundle_identifier=None)

Ma question est : est-ce que quelqu’un a déjà packagé avec succès une app avec un fichier JSON Storage ?

Bon, cela fait plusieurs jours que je cherche, je décide de poster une question sur ce forum, et je trouve moi-même la réponse :

Je n’avais pas compris qu’il ne fallait pas tenter de packager le fichier 'store.json' mais le créer à l’extérieur de l’application, grâce à un chemin absolu, comme :

# main.py
class PlanningApp(App):
    def build(self):
        store = JsonStore('/Users/leir/Documents/planning/store.json')
        store.put('test', note='test')
        return ScreensManager()

Sujet résolut donc, désolé du dérangement…

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte