KivyMD

时间:2020-06-09 21:10:23

标签: python-3.x kivy

我在KivyMD中放置MDDropdownMenu时遇到了问题。而且我认为我发现了一个小错误。这是代码的相关部分。

.PY

class MainApp(MDApp):
    [...]
    def on_start(self):
        menu_items = [{"icon": "apple", "text": f"Item #{i}"} for i in range(5)]
        self.menu = MDDropdownMenu(
            caller=self.root.ids.MD_menu_screen.ids.button, items=menu_items, width_mult=4
        )
    [...]

.KV

<MDMenuScreen>:
    MDRaisedButton:
        id: button
        pos_hint: {'center_x': .5, 'center_y': .5}
        text: 'Open menu'
        on_release:
            app.menu.open()

它可以工作,但是错误在于菜单的位置。启动应用程序,然后单击按钮,它看起来像this

但这不是最奇怪的部分,当我调整窗口大小时,即使我重新调整大小然后将其放回正常状态,它看起来也normal

所以,我认为这不是我的代码有问题。这可能只是一个错误。现在我希望有人对此进行(临时)修复。预先感谢!

1 个答案:

答案 0 :(得分:2)

我自己找到了解决方法!我查看了MDmenu的源代码,发现它有一个名为check_position_caller(self, instance, width, height)的方法,并且每次窗口大小或位置改变时都会调用此函数。由于菜单在调整窗口大小后仍然可以正常工作,因此我认为这可能是因为调用了该方法以再次找到调用者的位置。

因此,我的解决方案是在按下打开菜单的按钮时调用此方法。这样,菜单将首先确保找到呼叫者的正确位置,然后立即在该位置打开它。因此,长话短说:

更改此:

<MDMenuScreen>:
    MDRaisedButton:
        id: button
        pos_hint: {'center_x': .5, 'center_y': .5}
        text: 'Open menu'
        on_release:
            app.menu.open()

对此:

<MDMenuScreen>:
    MDRaisedButton:
        id: button
        pos_hint: {'center_x': .5, 'center_y': .5}
        text: 'Open menu'
        on_release:
            # Pass three arguments because the func needs them, it doesn't actually use them
            app.menu.check_position_caller(None, None, None) 
            app.menu.open()

似乎此错误仅在有多个屏幕时才会发生。

我还发现这不是唯一出现此问题的小部件。例如,MDBottomNavigation也存在此问题,我找到了类似的修复程序。