Kivy: Le menu déroulant se ferme immédiatement après l'ouverture

Créé le 28 avr. 2017  ·  6Commentaires  ·  Source: kivy/kivy

Versions

  • Python : 2,7
  • OS : androïde
  • Kivy : maître

La description

Le menu déroulant ne fonctionne pas dans le plus récent. Il apparaît et se ferme sans raison. Face à ce problème uniquement sur la construction Android avec la chaîne d'outils android_new buildozer

Code

from kivy.app import App
from kivy.lang import Builder


kv = '''
BoxLayout:
    orientation: 'vertical'
    BoxLayout:
        size_hint_y: None
        height: '50sp'
        Button:
            id: button
            text: 'Open dropdown'
    Widget:

    DropDown:
        id: dropdown
        on_parent: self.dismiss()

        Button:
            size_hint_y: None
            text: 'item 1'
        Button:
            size_hint_y: None
            text: 'item 2'
        Button:
            size_hint_y: None
            text: 'item 3'
'''


class MyApp(App):
    def build(self):
        self.root = Builder.load_string(kv)
        self.root.ids.button.bind(on_release=self.root.ids.dropdown.open)
        return self.root


MyApp().run()

apk

MonApp-debug.zip

Widgets

Commentaire le plus utile

Mettre le on_parent: self.dismiss() sur le bouton fonctionne comme prévu. Il n'ouvrira pas automatiquement le DropDown lors du premier lancement de l'application et il ne fermera pas automatiquement le DropwDown une fois qu'il est ouvert.

Remplacez l'appel par : on_parent: dropdown.dismiss() .

C'est un peu "hacky" mais ça marche bien.

#:kivy 1.0

<InputFileDropDown>:

    Button:
        id: btn
        text: 'Input File'
        on_parent: dropdown.dismiss()
        on_release: dropdown.open(self)
        size_hint_y: None
        height: 35

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

        Button:
            text: 'First Item'
            size_hint_y: None
            height: 35
            on_release: dropdown.select('First Item')

        Label:
            text: 'Second Item'
            size_hint_y: None
            height: 35

        Button:
            text: 'Third Item'
            size_hint_y: None
            height: 35
            on_release: dropdown.select('Third Item')

'InputFileDropDown' est un BoxLayout fyi.

Tous les 6 commentaires

Je pense que c'est un bogue dans stable (du moins c'est de là que vient ce code) et est corrigé dans master. Pour être plus précis, voici ce que vous voyez :

  • DropDown est ajouté en tant qu'enfant (parce que vous l'avez ajouté manuellement) -> a un parent
  • l'événement on_parent est déclenché -> rejette DropDown

tout semble bien jusqu'à présent, _pourtant_ la logique derrière DropDown est qu'un utilisateur est censé l' attacher à quelque chose (via son propre comportement avec Dropdown.open(<widget>) ) et _pas_ l' ajouter _en tant qu'enfant_ à un widget. Eh bien, du moins pas de cette façon lorsque vous essayez de le cacher avec on_parent: self.dismiss() parce que vous l'avez mal utilisé dès le début. Voyez ce qui se passe ensuite (jeu de mots :D ) !

  • DropDown est rejeté, mais vous l'attachez (maintenant correctement) au widget, car <widget>.bind(<stuff>) transmet un argument à la méthode DropDown.open() - l'instance du bouton
  • DropDown est ajouté en tant qu'enfant via son propre comportement quelque part (probablement au bouton, je ne suis pas sûr maintenant) et le on_parent DropDown est mis à jour
  • on_parent est mis à jour et déclenche l'événement de rejet <- voir ?

Alors, que faire maintenant ? Tout d'abord, vous devez arrêter d'utiliser on_parent cette façon et faire soit :

<MyDropDown>:  # make a class in python (or use "@DropDown" and Factory)
    text: 'blah'
# and *don't* add it as a child manually

qui ne fait que la règle KV elle-même sans l'utiliser directement comme enfant (comme une comparaison classe vs instance) ou si vous voulez opter pour le comportement d'ajout de widget, utilisez Spinner car il est construit à cet effet.

Théoriquement, vous pourrez peut-être délier l'événement on_parent bien que je ne sois pas sûr que ce soit directement dans on_parent ou seulement de l'extérieur, mais c'est juste une mauvaise façon de "faire fonctionner" , donc je ne vais pas l'écrire. ??

Merci. J'ai utilisé DropDown comme nouvelle classe et cela a fonctionné

Pourriez-vous expliquer comment utiliser @DropDown dans le fichier kv ?

J'ai kivy 1.10.1, windows 10, python 3.7 et cela fonctionne pour moi si je n'écris pas on_parent: self.dismiss() (ce que je ne sais pas ce qu'il fait)

Mettre le on_parent: self.dismiss() sur le bouton fonctionne comme prévu. Il n'ouvrira pas automatiquement le DropDown lors du premier lancement de l'application et il ne fermera pas automatiquement le DropwDown une fois qu'il est ouvert.

Remplacez l'appel par : on_parent: dropdown.dismiss() .

C'est un peu "hacky" mais ça marche bien.

#:kivy 1.0

<InputFileDropDown>:

    Button:
        id: btn
        text: 'Input File'
        on_parent: dropdown.dismiss()
        on_release: dropdown.open(self)
        size_hint_y: None
        height: 35

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

        Button:
            text: 'First Item'
            size_hint_y: None
            height: 35
            on_release: dropdown.select('First Item')

        Label:
            text: 'Second Item'
            size_hint_y: None
            height: 35

        Button:
            text: 'Third Item'
            size_hint_y: None
            height: 35
            on_release: dropdown.select('Third Item')

'InputFileDropDown' est un BoxLayout fyi.

@GaryBer

... la logique derrière DropDown est qu'un utilisateur est censé l'attacher à quelque chose (via son propre comportement avec Dropdown.open()) et ne pas l'ajouter en tant qu'enfant à un widget. ...

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

fishfin05 picture fishfin05  ·  5Commentaires

damienflament picture damienflament  ·  3Commentaires

hansent picture hansent  ·  3Commentaires

asmith26 picture asmith26  ·  3Commentaires

shifters67 picture shifters67  ·  6Commentaires