0
votes

Kivy ScreenManager Switching "Démarrer" sur une condition

Je suis nouveau à Kivy et je voulais démarrer un petit projet d'application. Ce que je veux réaliser:

  • Lorsque vous démarrez l'application pour la première fois -> Afficher un écran avec une sorte de formulaire UserData ​​Li>
  • Stockez les données dans un JSONSTORE -> Allez à l'écran principal Li>
  • En cours d'exécution de l'application -> Vérifiez si UserData est à JSONSTORE et allez directement à l'écran principal LI> ul>

    Jusqu'à présent, j'ai trouvé une solution de travail, mais cela ne me plaise pas vraiment de la façon dont cela fonctionne. Ce que je veux, c'est créer ScreenManager et écrans dans le fichier .kv et que le fichier .pyypy effectue la logique (quel écran à charger en vérifiant si UserData existe dans le magasin). P>

    J'ai essayé: p>

    • Utilisation de la classe ScreenManager (DEF __INIT__) - N'a pas fonctionné Li>
    • appeler une méthode de l'intérieur du fichier .kv comme suit (ne fonctionne pas non plus): LI> ul> xxx pré>

      Voici mon code de travail jusqu'à présent: p>

      Main.py: p>

      #:kivy 1.11.1
      
      <MainWindow>:
          FloatLayout:
              Label:
                  text:
              Button:
                  text: "Go Back"
                  pos_hint: {"x": 0.45, "top": 0.5}
                  size_hint: (0.1, 0.05)
                  on_release:
                      app.root.current = "login"
      
      <LoginWindow>:
          nick: nickname
          isle: island
          hemisphere_n: hemisphere_n
          hemisphere_s: hemisphere_s
          FloatLayout:
              Label:
                  text: "Nickname:"
                  pos_hint: {"x": 0.45, "top": 0.7}
                  size_hint: (0.1, 0.05)
              TextInput:
                  id: nickname
                  multiline: False
                  pos_hint: {"x": 0.4, "top": 0.65}
                  size_hint: (0.2, 0.05)
      
              Label:
                  text: "Island Name:"
                  pos_hint: {"x": 0.45, "top": 0.6}
                  size_hint: (0.1, 0.05)
              TextInput:
                  id: island
                  multiline: False
                  pos_hint: {"x": 0.4, "top": 0.55}
                  size_hint: (0.2, 0.05)
              Label:
                  text: "Hemisphere:"
                  pos_hint: {"x": 0.45, "top": 0.5}
                  size_hint: (0.1, 0.05)
              ToggleButton:
                  id: hemisphere_n
                  text: "North"
                  group: "hemisphere"
                  state: "down"
                  pos_hint: {"x": 0.41, "top": 0.45}
                  size_hint: (0.08, 0.05)
              ToggleButton:
                  id: hemisphere_s
                  text: "South"
                  group: "hemisphere"
                  pos_hint: {"x": 0.51, "top": 0.45}
                  size_hint: (0.08, 0.05)
              Button:
                  text: "Submit"
                  pos_hint: {"x": 0.45, "top": 0.38}
                  size_hint: (0.1, 0.05)
                  on_press:
                      root.submit()
                  on_release:
                      app.root.current = "main"
      


2 commentaires

Vous dites que cela fonctionne, mais cela ne vous plaisait pas. Qu'est-ce qui ne plaît pas exactement?


La façon dont cela fonctionne en ce moment: Aller à l'écran principal -> puis vérifiez s'il existe UserData stocké -> si vous n'allez pas sur l'écran UserForm / Connexion. N'y a-t-il pas une option pour vérifier à l'avance userData, puis basé sur le retour aller à l'écran principal ou userData? Le premier commutateur de l'écran principal à la connexion est en fait visible ...


3 Réponses :


0
votes

Ce que vous voyez est la transition animation. Vous pouvez éliminer cela en utilisant notransition () comme ceci: xxx


3 commentaires

OK, cela éliminerait la transition visible, mais cela ne changerait pas la manière dont il fonctionne ou donnerait à l'écran de scénario une sorte de logique pour décider quel écran serait approprié d'afficher. Si cela ne fonctionne pas d'autre manière, j'utiliserais cette solution en combinaison avec l'écran blanc de @ Nattosai.


Je pensais que le si sinon était la logique. Y a-t-il une autre logique pour décider quel écran à afficher?


Oui c'est la logique que je mets là pour faire fonctionner les choses. Mais je cherche une possibilité d'avoir cette logique en cours d'exécution dans ScreenManager lui-même afin que l'écran ScreenManager soit capable de décider de l'écran d'abord. Comme suit: ScreenManager -> Vérifications pour UserData -> Si vous existez, affichez l'écran principal -> sinon afficher l'écran de connexion



0
votes

Que diriez-vous d'ajouter un écran vide d'abord en plus de la réponse @ John.

sm.add_widget(Screen(name='blank'))
for screen in screens:
    sm.add_widget(screen)


0 commentaires

0
votes

Vous pouvez mettre votre écran code> logique de choix à peu près où vous le souhaitez. Voici un exemple de la mise dans votre WindowManager Code> Classe: xxx pré>

alors vous pouvez appeler le select_start_screen () code> dans votre Construire () Code> Méthode: P>

class MainApp(App):
    def build(self):
        sm.select_start_screen()
        return sm


0 commentaires