python-3.x - KivyMD 中 MDDropdownMenu 的定位错误

标签 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 .

所以,我认为这不是我的代码的问题。这可能只是一个错误。现在我希望有人能(临时)解决这个问题。提前致谢!

最佳答案

我自己找到了解决办法!我查看了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 也有这个问题,我找到了类似的修复方法。

关于python-3.x - KivyMD 中 MDDropdownMenu 的定位错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62291908/

相关文章:

python-3.x - Kivy - 访问 .kv 文件中 ListProperty 的元素

android - 如何在android中调试kivy应用程序?

Python kivy之二 GridLayout和Screen Manager

python - 子表上的 QAbstractItemModel header

python - 如何更改运行 Pulsar 的端口?

python - Pandas 根据行中其他单元格的值为单元格赋值

android - 使用 Kivy 访问 Android 相机时出现错误

python - Kivy:绑定(bind)两个方法一个接一个地调用

python-3.x - 无法使 Python 3.7 在 Ubuntu 18.04 中工作

python - 将 tensorflow 检查点加载为 keras 模型