【问题标题】:Positioning error in MDDropdownMenu in KivyMDKivyMD 中 MDDropdownMenu 中的定位错误
【发布时间】:2020-06-09 21:10:23
【问题描述】:

我在 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

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

【问题讨论】:

    标签: python-3.x kivy


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多