Kivy: Dropdown ditutup segera setelah pembukaan

Dibuat pada 28 Apr 2017  ·  6Komentar  ·  Sumber: kivy/kivy

Versi

  • Python: 2.7
  • OS: android
  • Kivy: tuan

Keterangan

Dropdown tidak berfungsi di terbaru. Itu muncul dan ditutup tanpa alasan. Menghadapi masalah ini hanya pada bangunan Android dengan toolchain android_new buildozer

Kode

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

MyApp-debug.zip

Widgets

Komentar yang paling membantu

Menempatkan on_parent: self.dismiss() pada Tombol berfungsi sebagaimana dimaksud. Itu tidak akan secara otomatis membuka DropDown ketika Aplikasi pertama kali diluncurkan dan tidak akan secara otomatis menutup DropwDown setelah dibuka.

Ubah panggilan menjadi: on_parent: dropdown.dismiss() .

Ini agak "retas" tetapi berfungsi dengan baik.

#: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' adalah fyi BoxLayout.

Semua 6 komentar

Saya pikir ini adalah bug di stable (setidaknya dari situlah kode tersebut berasal) dan diperbaiki di master. Untuk lebih spesifik, inilah yang Anda lihat:

  • DropDown ditambahkan sebagai anak (karena Anda menambahkannya secara manual) -> memiliki orang tua
  • acara on_parent dipicu -> menolak DropDown

semuanya tampak baik-baik saja sampai sekarang, _yet_ logika di DropDown adalah bahwa pengguna seharusnya _melampirkan_ ke sesuatu (melalui perilakunya sendiri dengan Dropdown.open(<widget>) ) dan _not_ menambahkannya _sebagai anak_ ke beberapa widget. Yah, setidaknya tidak seperti ini ketika Anda mencoba menyembunyikannya dengan on_parent: self.dismiss() karena Anda salah menggunakannya di awal. Lihat apa yang terjadi selanjutnya (permainan kata :D )!

  • DropDown ditutup, tetapi Anda (sekarang dengan benar) melampirkannya ke widget, karena <widget>.bind(<stuff>) meneruskan argumen ke metode DropDown.open() - instance tombol
  • DropDown ditambahkan sebagai anak melalui perilakunya sendiri di suatu tempat (mungkin ke tombol, saya tidak yakin sekarang) dan on_parent DropDown diperbarui
  • on_parent diperbarui dan memicu acara pemberhentian <- lihat?

Jadi, apa yang harus dilakukan sekarang? Pertama-tama, Anda harus berhenti menggunakan on_parent dengan cara ini dan lakukan:

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

yang hanya membuat aturan KV itu sendiri tanpa menggunakannya sebagai anak secara langsung (seperti perbandingan kelas vs instance) atau jika Anda ingin menggunakan perilaku menambahkan widget, gunakan Spinner karena dibuat untuk tujuan itu.

Secara teoritis Anda mungkin dapat melepaskan ikatan acara on_parent meskipun saya tidak yakin apakah bahkan secara langsung di on_parent atau hanya dari luar, tetapi itu hanya cara yang buruk untuk "membuatnya berfungsi" , jadi saya tidak akan menulisnya. 😋

Terima kasih. Saya menggunakan DropDown sebagai kelas baru dan ini berhasil

Bisakah Anda menguraikan cara menggunakan @DropDown di file kv?

Saya memiliki kivy 1.10.1, windows 10, python 3.7 dan berfungsi untuk saya jika saya tidak menulis on_parent: self.dismiss() (yang saya tidak tahu apa fungsinya)

Menempatkan on_parent: self.dismiss() pada Tombol berfungsi sebagaimana dimaksud. Itu tidak akan secara otomatis membuka DropDown ketika Aplikasi pertama kali diluncurkan dan tidak akan secara otomatis menutup DropwDown setelah dibuka.

Ubah panggilan menjadi: on_parent: dropdown.dismiss() .

Ini agak "retas" tetapi berfungsi dengan baik.

#: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' adalah fyi BoxLayout.

@GaryBer

... logika di DropDown adalah bahwa pengguna seharusnya melampirkannya ke sesuatu (melalui perilakunya sendiri dengan Dropdown.open()) dan tidak menambahkannya sebagai anak ke beberapa widget. ...

Apakah halaman ini membantu?
0 / 5 - 0 peringkat