2017-05-26 2 views
0

Note: Je ne suis pas un programmeur et je ne connais pas la terminologie exacte que je devrais utiliser. C'est un programme de base et je n'essaie pas d'utiliser littéralement les "kivy screens" ou le gestionnaire d'écran kivy.Python - Comment ajouter un deuxième "écran" à mon application kivy?

J'ai passé des heures à chercher partout sur google en essayant de résoudre ce problème et je suis à court. J'ai un programme python kivy. J'ai créé l'écran de démarrage initial. Lorsque l'utilisateur clique sur un jeu particulier, je veux que l'écran efface toutes les données sur le premier écran, puis place des boutons et des étiquettes sur l'écran. Presque comme un "nouvel" écran. Je l'ai actuellement à l'endroit où il efface l'écran quand un utilisateur sélectionne un jeu, mais si j'essaye et ajoute des boutons à cet écran, ils peuplent sur l'écran principal.

Ceci est mon code python:

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.uix.dropdown import DropDown 

class MadLib(Widget): 
    pass 

class MadlibApp(App): 
    def build(self): 
     return MadLib() 

app = MadlibApp() 

if __name__ == '__main__': 
    app.run() 

Voici mon fichier .kv:

<MadLib>: 
    canvas: 
     Color: 
      rgba: 0.2, 0.8, 0.2, 1 
     Rectangle: 
      pos: 0, 0 
      size: self.width, self.height 


    Button: 
     tag: 'exit' 
     background_color: 0, 0, 0, 0 
     height: 100 
     width: 100 
     center_x: root.width - self.width/2 
     top: root.top 
     on_press: app.stop() 
     Image: 
      source: r"C:\Users\kraak\Desktop\Python\Python\basicexitbutton.gif" 
      top: root.top 
      center_x: root.width - self.width/2 
      size_hint_y: None 
      height: '96dp' 

    Button: 
     tag: 'menu' 
     background_color: 0, 0, 0, 0 
     id: btn 
     top: root.top - 10 
     center_x: self.width/2 + 10 
     on_release: dropdown.open(self) 
     size_hint_y: None 
     height: '48dp' 
     width: '175dp' 
     Image: 
      source: r"C:\Users\kraak\Desktop\Python\Python\basicmenubutton.gif" 
      top: root.top + 10 
      center_x: self.width/2 
      size_hint_y: None 
      height: '96dp' 

    Widget: 
     on_parent: dropdown.dismiss() 

    DropDown: 

     id: dropdown 
     on_select: btn.text = '{}'.format(args[1]) 

     Button: 
      center_x: self.width/2 
      text: 'Browse' 
      font_size: '32' 
      background_color: 0, 0 ,0, 0 
      size_hint_y: None 
      height: '48dp' 
      on_release: dropdown.select('A') 

     Button: 
      text: 'Categories' 
      font_size: '32' 
      background_color: 0, 0 ,0, 0 
      size_hint_y: None 
      height: '48dp' 
      on_release: dropdown.select('B') 

     Button: 
      text: 'Settings' 
      font_size: '32' 
      background_color: 0, 0 ,0, 0 
      size_hint_y: None 
      height: '48dp' 
      on_release: dropdown.select('C') 

    Button: 
     text: 'Game 1' 
     font_size: '32' 
     background_color: 0, 0 ,0, 0 
     size_hint_y: None 
     height: '48dp' 
     top: root.top/1.33 
     center_x: root.width/4 
     on_press: root.clear_widgets() 

    Button: 
     text: 'Game 2' 
     font_size: '32' 
     background_color: 0, 0 ,0, 0 
     size_hint_y: None 
     height: '48dp' 
     top: root.top/1.66 
     center_x: root.width/4 
     on_release: dropdown.select('C') 

<Game1>: 
    Button: 
     id: tst 
     text: 'Test' 
     font_size: '32' 
     background_color: 0, 0 ,0, 0 
     size_hint_y: None 
     height: '48dp' 
     top: root.top 
     center_x: root.width/4 

Lorsque l'utilisateur clique sur le jeu 1, je voudrais pour sauter au jeu 1 classe , cependant, il ne peut pas parce que le programme ne sait pas qu'il existe encore. Je ne suis pas sûr de savoir comment régler ça.

Répondre

1

Vous parlez d'écrans mais vous ne semblez pas utiliser d'écrans kivy réels. Vous devez avoir un ScreenManager et ensuite créer des objets séparés Screen sur lesquels vous pouvez mettre vos widgets.

Il est littéralement le premier résultat lorsque vous google "kivy screens", s'il vous plaît faites vos devoirs la prochaine fois.

Voici un petit tutoriel sur la façon de convertir votre code existant en quelque chose qui utilise correctement les écrans. Considérez que vous avez le code .kv suivant:

<[email protected]>: 
    text: "I'm first" 

<[email protected]>: 
    text: "I'm second..." 

Vous voulez que le premier bouton pour être sur un écran et le second sur une autre. Premièrement, faites-les dans un Screen. Habituellement, il suffit de changer le widget racine à un écran et déplacer tous les autres widgets à l'écran. L'exemple ressemble maintenant à ceci:

<[email protected]>: 
    name: "first_screen" # a name is like an id but only for the screen manager 
    Button: 
     text: "I'm first" 

<[email protected]>: 
    name: "second_screen" 
    Button: 
     text: "I'm second..." 

Vous avez maintenant besoin d'un gestionnaire d'écran. Dans celui-ci, ajoutez tous les écrans que vous allez utiliser. Je vais en faire le widget racine. Je vais aussi faire en sorte que appuyant sur le bouton sur le premier écran change au deuxième écran et vice versa:

ScreenManager: 
    First: 
    Second: 

<[email protected]>: 
    name: "first_screen" 
    Button: 
     text: "I'm first" 
     # root.manager.current is magic that gives you the current screen manager 
     on_release: root.manager.current = "second_screen" 

<[email protected]>: 
    name: "second_screen" 
    Button: 
     on_release: root.manager.current = "first_screen" 
     text: "I'm second..." 

Ca y est! Vous pouvez changer les types de transition et d'autres détails, jetez un oeil à la docs.

Pour jeter un oeil à cet exemple exécuter ce fichier .py:

from kivy.base import runTouchApp 
from kivy.lang import Builder 

runTouchApp(Builder.load_string(""" 
ScreenManager: 
    First: 
    Second: 

<[email protected]>: 
    name: "first_screen" # a name is like an id but only for the screen manager 
    Button: 
     text: "I'm first" 
     # root.manager.current is magic that gives you the current screen manager 
     on_release: root.manager.current = "second_screen" 

<[email protected]>: 
    name: "second_screen" 
    Button: 
     on_release: root.manager.current = "first_screen" 
     text: "I'm second..." 
      """)) 
+0

Je ne suis pas essayer d'utiliser des écrans littérales. Je dois juste faire un programme de base et vouloir le garder aussi simple que possible. Je ne suis pas un programmeur d'expérience, donc je ne connais pas la terminologie exacte que je devrais utiliser. –

+0

Ne vous inquiétez pas, c'est vraiment simple. Et la terminologie est simple: il y a un widget ScreenManager qui ne peut contenir qu'un seul écran. Ensuite, il y a Screen qui peut contenir tous les widgets que vous avez déjà. Regardez quelques [exemples] (https://kivy.org/docs/api-kivy.uix.screenmanager.html#basic-usage). Vous ne devrez pas changer de code, à peu près 10-15 lignes. Répondre lorsqu'il est bloqué. –

+0

Merci. Je suppose que je vais essayer. Peut-être que cela m'aidera à rendre le programme plus avancé pour mon prochain semestre. –