Dropdown tidak berfungsi di terbaru. Itu muncul dan ditutup tanpa alasan. Menghadapi masalah ini hanya pada bangunan Android dengan toolchain android_new
buildozer
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()
Saya pikir ini adalah bug di stable (setidaknya dari situlah kode tersebut berasal) dan diperbaiki di master. Untuk lebih spesifik, inilah yang Anda lihat:
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 )!
<widget>.bind(<stuff>)
meneruskan argumen ke metode DropDown.open()
- instance tombolon_parent
DropDown diperbaruiJadi, 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. ...
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.
'InputFileDropDown' adalah fyi BoxLayout.