我在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。
所以,我认为这不是我的代码有问题。这可能只是一个错误。现在我希望有人对此进行(临时)修复。预先感谢!
答案 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也存在此问题,我找到了类似的修复程序。