Kivy - 触摸后添加其他 MDFloatingActionButton

Kivy - Add others MDFloatingActionButton after touch

我试图在单击按钮后添加 MDFloatingActionButton 小部件,但我没有得到它。

有人可以帮我解决这个问题。

目标是在单击带有加号图标的 FAB 后创建一个按钮列表。

我尝试以多种方式向 add_widget() 添加代码,但 none 有效。

fab.py

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty
from kivymd.theming import ThemeManager
from kivymd.time_picker import MDTimePicker
from kivymd.button import MDFloatingActionButton
from kivy.animation import Animation
from kivy.core.window import Window

Window.clearcolor = (1, 1, 1, 1)

class MDFloatingActionButtonList(MDFloatingActionButton):
    angle = NumericProperty(0)
    def on_touch_up(self, touch):
        if self.collide_point(*touch.pos):
            if self.angle == 0:
                self.angle += 45
                #MDFloatingActionButton.add_widget()
            else:
                self.angle -= 45

class Fab(App):
    theme_cls = ThemeManager()
    def build(self):
        return MDFloatingActionButtonList()    

Fab().run()

fab.kv

<MDFloatingActionButtonList>:
    canvas.before:                                                                                                                                             
        PushMatrix                                                                                                                                             
        Rotate:                                                                                                                                                
            angle: self.angle                                                                                                                                  
            axis: (0, 0, 1)                                                                                                                                    
            origin: self.center                                                                                                                                
    canvas.after:                                                                                                                                              
        PopMatrix
    MDFloatingActionButton:
        id: float_act_btn
        icon: 'plus'
        opposite_colors: True
        elevation_normal: 8
        pos_hint: {'center_x': 0.5, 'center_y': 0.2}

结果:

目标例如:

天哪,这是一个艰难的过程。 KivyMD 项目的文档很少,尽管设计非常漂亮。

好的,下面是它的外观示例:

from kivy.app import App
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout

from kivymd.button import MDFloatingActionButton
from kivymd.menu import MDDropdownMenu
from kivymd.theming import ThemeManager

Window.clearcolor = (1, 1, 1, 1)

menu_items = [
    {'viewclass': 'MDFloatingActionButton',
     'text': 'Example',
     'on_press': lambda: print("Hello")},
    {'viewclass': 'MDFloatingActionButton',
     'text': 'Example'},
    {'viewclass': 'MDFloatingActionButton',
     'text': 'Example'},
    {'viewclass': 'MDFloatingActionButton',
     'text': 'Example item'},
    {'viewclass': 'MDFloatingActionButton',
     'text': 'Example'},
    {'viewclass': 'MDFloatingActionButton',
     'text': 'Example'},
    {'viewclass': 'MDFloatingActionButton',
     'text': 'Example'},
]


class Fab(App):
    theme_cls = ThemeManager()
    layout = BoxLayout()
    md = MDDropdownMenu(items=menu_items)

    def build(self):
        button = MDFloatingActionButton()
        self.layout.add_widget(button)
        button.bind(on_press=lambda x: self.md.open(button))
        return self.layout


Fab().run()

另一种方法是手动将按钮添加到 window。但是你将不得不处理解雇(我没有实现它):

from kivy.app import App
from kivy.core.window import Window

from kivymd.button import MDFloatingActionButton
from kivymd.theming import ThemeManager

Window.clearcolor = (1, 1, 1, 1)


class Fab(App):
    theme_cls = ThemeManager()
    button = None

    def build(self):
        self.button = MDFloatingActionButton()
        self.button.bind(on_press=lambda x: self.open_menu(self.button))
        return self.button

    def open_menu(self, instance):
        x, y = instance.to_window(instance.x, instance.center_y)

        for i in range(1, 5):
            Window.add_widget(MDFloatingActionButton(center_y=y+100*i, x=x))


Fab().run()

你为什么不试试这个?

MDFloatingActionButtonSpeedDial

from kivy.lang import Builder

from kivymd.app import MDApp

KV = '''
Screen:

    MDFloatingActionButtonSpeedDial:
        data: app.data
        root_button_anim: True
'''


class Example(MDApp):
     data = {
           'language-python': 'Python',
           'language-php': 'PHP',
           'language-cpp': 'C++',
      }

     def build(self):
           return Builder.load_string(KV)


Example().run()

这是输出: