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