Kivy安卓实战 | 工具箱: 下拉菜單 - 图1
© Karobben

由於語法渲染問題而影響閱讀體驗, 請移步博客閱讀~
本文GitPage地址

  1. CryptoWatch-Kivy 1.13
  2. Kivy 2.0.0
  3. Kivy-Garden 0.1.4
  4. kivy-garden.wordcloud 1.0.0
  5. kivymd 0.104.2.dev0

Quick Review

  1. tree
  1. ├── bin
  2. └── KarobbenTB-1.3-armeabi-v7a-debug.apk
  3. ├── buildozer.spec
  4. ├── favicon.ico
  5. ├── font
  6. ├── FangZhengHeiTiFanTi-1.ttf
  7. ├── HuaKangXinZhuanTi-1.ttc
  8. ├── HuaKangXinZhuanTi-1.ttf
  9. └── JingDianFanJiaoZhuan-1.ttf
  10. ├── Layout
  11. ├── filechooser.kv
  12. ├── Navigation_Draw.kv
  13. ├── Navigation_Tabs.kv
  14. └── Seq.kv
  15. ├── lib
  16. └── bio_seq.py
  17. ├── libWidget
  18. ├── filechooser.py
  19. ├── menu.py
  20. └── Seq.py
  21. ├── logo.png
  22. └── main.py

Example

Document: HeaTTheatR, GitHub Issues

This example is for another KVmd version = =

  1. from kivy.lang import Builder
  2. from kivymd.app import MDApp
  3. from kivymd.uix.menu import MDDropdownMenu
  4. KV = '''
  5. Screen:
  6. MDRaisedButton:
  7. id: button
  8. text: "PRESS ME"
  9. pos_hint: {"center_x": .5, "center_y": .5}
  10. on_release: app.menu.open()
  11. '''
  12. class Test(MDApp):
  13. def __init__(self, **kwargs):
  14. super().__init__(**kwargs)
  15. self.screen = Builder.load_string(KV)
  16. menu_items = [{"text": f"Item {i}"} for i in range(5)]
  17. self.menu = MDDropdownMenu(
  18. caller=self.screen.ids.button,
  19. items=menu_items,
  20. width_mult=4,
  21. )
  22. self.menu.bind(on_release=self.menu_callback)
  23. def menu_callback(self, instance_menu, instance_menu_item):
  24. print(instance_menu, instance_menu_item.text)
  25. self.screen.ids.button.text = instance_menu_item.text
  26. self.menu.dismiss()
  27. def build(self):
  28. return self.screen
  29. Test().run()
Kivy安卓实战 | 工具箱: 下拉菜單 - 图2

Example from document

This is for version 0.104.2.dev0

Installed by pip install https://github.com/kivymd/KivyMD/archive/master.zip

  1. from kivy.lang import Builder
  2. from kivy.metrics import dp
  3. from kivy.properties import StringProperty
  4. from kivymd.uix.list import OneLineIconListItem
  5. from kivymd.app import MDApp
  6. from kivymd.uix.menu import MDDropdownMenu
  7. KV = '''
  8. <IconListItem>
  9. IconLeftWidget:
  10. icon: root.icon
  11. MDScreen
  12. MDTextField:
  13. id: field
  14. pos_hint: {'center_x': .5, 'center_y': .6}
  15. size_hint_x: None
  16. width: "200dp"
  17. hint_text: "Password"
  18. on_focus: if self.focus: app.menu.open()
  19. '''
  20. class IconListItem(OneLineIconListItem):
  21. icon = StringProperty()
  22. class Test(MDApp):
  23. def __init__(self, **kwargs):
  24. super().__init__(**kwargs)
  25. self.screen = Builder.load_string(KV)
  26. menu_items = [
  27. {
  28. "viewclass": "IconListItem",
  29. "icon": "git",
  30. "height": dp(56),
  31. "text": f"Item {i}",
  32. "on_release": lambda x=f"Item {i}": self.set_item(x),
  33. } for i in range(5)]
  34. self.menu = MDDropdownMenu(
  35. caller=self.screen.ids.field,
  36. items=menu_items,
  37. position="bottom",
  38. width_mult=4,
  39. )
  40. def set_item(self, text__item):
  41. self.screen.ids.field.text = text__item
  42. self.menu.dismiss()
  43. def build(self):
  44. return self.screen
  45. Test().run()

Write is as a widget

  1. touch libWidget/menu.py
  2. touch Layout/menu.kv

menu.py

  1. from kivymd.uix.menu import MDDropdownMenu
  2. from kivymd.uix.floatlayout import MDFloatLayout
  3. #KV = '''
  4. '''
  5. Screen:
  6. MDRaisedButton:
  7. id: button
  8. text: "PRESS ME"
  9. pos_hint: {"center_x": .5, "center_y": .5}
  10. on_release: app.menu.open()
  11. '''
  12. class Menu(MDFloatLayout):
  13. #menu = MDDropdownMenu()
  14. def __init__(self, **kwargs):
  15. #super().__init__(**kwargs)
  16. #self.screen = Builder.load_string(KV)
  17. menu_items = [{"text": f"Item {i}",
  18. "viewclass": "OneLineListItem",
  19. 'font_name': "./font/FangZhengHeiTiJianTi-1",
  20. "on_release": lambda x=f"Item {i}": self.menu_callback(x)} for i in range(4)]
  21. self.menu = MDDropdownMenu(
  22. #caller=self.screen.ids.button,
  23. caller= None,
  24. items=menu_items,
  25. width_mult=4,
  26. )
  27. self.menu.bind(on_release=self.menu_callback)
  28. print(123)
  29. #return self.menu
  30. #
  31. def menu_callback(self, instance_menu_item):
  32. print("instance_menu", instance_menu_item)
  33. #self.page_callback()
  34. self.test ="Change Page"
  35. print(self.test)
  36. self.menu.dismiss()
  37. def page_callback(self):
  38. self.test ="Change Page"
  39. print(self.test)
  40. # let's start
  41. def pop(self):
  42. self.menu.open()

Insert to page:

  1. from kivy.uix.screenmanager import Screen
  2. from kivymd.app import MDApp
  3. from kivymd.uix.button import MDRectangleFlatButton
  4. from menu import Menu as Seq_Menu
  5. class MainApp(MDApp):
  6. + Seq_Menu = Seq_Menu()
  7. def build(self):
  8. screen = Screen()
  9. self.Button = MDRectangleFlatButton(
  10. text="Hello, World",
  11. pos_hint={"center_x": 0.5, "center_y": 0.5})
  12. + self.Button.on_release = self.Seq_Menu.pop
  13. + self.Seq_Menu.menu.caller = self.Button
  14. + self.Seq_Menu.menu.bind(on_release = self.menu_callback)
  15. +
  16. + for i in range(len(self.Seq_Menu.menu.items)):
  17. + self.Seq_Menu.menu.items[i]['text'] = "A" + str(i)
  18. + self.Seq_Menu.menu.items[i]['on_release'] = lambda x=str(i)+": test": self.menu_callback(x)
  19. screen.add_widget(self.Button)
  20. return screen
  21. + def menu_callback(self, Text):
  22. + print(123, Text)
  23. + self.Button.text = "Choosed: "+Text
  24. + self.Seq_Menu.menu.dismiss()
  25. MainApp().run()

After imported the widget, we should bind the pop and the menu.bind. pop is for popup the widget bubble menu.bind is for showing the MenuItems. You also need to bind the bottom wiht self.Seq_Menu.menu.caller = self.Button if the button is in ‘kv’ file, them, bind its id.

GitHub Repository: Karobben Toolbox
Android Release: Karobben Toolbox


Enjoy~

本文由Python腳本GitHub/語雀自動更新

由於語法渲染問題而影響閱讀體驗, 請移步博客閱讀~
本文GitPage地址

GitHub: Karobben
Blog:Karobben
BiliBili:史上最不正經的生物狗