Python 如何在kivy图形顶部显示kivy上下文菜单?

Python 如何在kivy图形顶部显示kivy上下文菜单?,python,kivy,Python,Kivy,我还在想基维,所以如果这是个愚蠢的问题,请原谅我。本质上,我有一个应用程序,它使用图形向用户显示数据。此外,我希望在窗口顶部有一个应用程序菜单,其中包含嵌套菜单。此文件几乎满足我的所有要求: import kivy from kivy.app import App from kivy.lang import Builder import kivy_garden.contextmenu import kivy_garden.graph kv = """ BoxLay

我还在想基维,所以如果这是个愚蠢的问题,请原谅我。本质上,我有一个应用程序,它使用图形向用户显示数据。此外,我希望在窗口顶部有一个应用程序菜单,其中包含嵌套菜单。此文件几乎满足我的所有要求:

import kivy
from kivy.app import App
from kivy.lang import Builder
import kivy_garden.contextmenu
import kivy_garden.graph

kv = """
BoxLayout:
    orientation: 'vertical'
    id: layout
    AppMenu:
        id: app_menu
        top: root.height
        cancel_handler_widget: layout

        AppMenuTextItem:
            text: "Menu #1"
            ContextMenu:
                ContextMenuTextItem:
                    text: "Item #11"
                ContextMenuTextItem:
                    text: "Item #12"
        AppMenuTextItem:
            text: "Menu Menu Menu #2"
            ContextMenu:
                ContextMenuTextItem:
                    text: "Item #21"
                ContextMenuTextItem:
                    text: "Item #22"
                ContextMenuTextItem:
                    text: "ItemItemItem #23"
                ContextMenuTextItem:
                    text: "Item #24"
                    ContextMenu:
                        ContextMenuTextItem:
                            text: "Item #241"
                        ContextMenuTextItem:
                            text: "Hello, World!"
                            on_release: app.say_hello(self.text)
                        # ...
                ContextMenuTextItem:
                    text: "Item #5"
    Graph:
        border_color: [0, 0, 0, 0]
        #background_color: [0.25, 0.25, 0.25, 1]
"""

class MyApp(App):
    def build(self):
        self.title = 'Simple app menu example'
        return Builder.load_string(kv)

    def say_hello(self, text):
        print(text)
        self.root.ids['app_menu'].close_all()

if __name__ == '__main__':
    MyApp().run()
您会注意到,当菜单出现时,白色的图形边框会覆盖它们。如果我们取消对kivy builder字符串中最后一行的注释,并为图形提供灰色背景色,则图形将绘制在应用程序菜单的顶部,打开菜单时不会显示任何内容

我知道kivy_garden.graph正在使用引擎盖下的画布绘制自己。那么,有没有一种方法可以让小部件在另一个小部件的画布上绘制呢?我也尝试过使用微调器和下拉列表来解决这个问题,但没有效果


谢谢你的帮助

我认为这是布局子元素绘制顺序的结果。当
图形作为布局中的最后一项时,它将在菜单上最后绘制。以下是您的
kv
的修改版本,它将菜单放在布局的最后一位:

FloatLayout:
    id: layout
    Graph:
        size_hint: 1, None
        height: root.height - app_menu.height
        border_color: [0, 0, 0, 0]
        background_color: [0.25, 0.25, 0.25, 1]
    AppMenu:
        id: app_menu
        top: root.height
        cancel_handler_widget: layout

        AppMenuTextItem:
            text: "Menu #1"
            ContextMenu:
                ContextMenuTextItem:
                    text: "Item #11"
                ContextMenuTextItem:
                    text: "Item #12"
        AppMenuTextItem:
            text: "Menu Menu Menu #2"
            ContextMenu:
                ContextMenuTextItem:
                    text: "Item #21"
                ContextMenuTextItem:
                    text: "Item #22"
                ContextMenuTextItem:
                    text: "ItemItemItem #23"
                ContextMenuTextItem:
                    text: "Item #24"
                    ContextMenu:
                        ContextMenuTextItem:
                            text: "Item #241"
                        ContextMenuTextItem:
                            text: "Hello, World!"
                            on_release: app.say_hello(self.text)
                        # ...
                ContextMenuTextItem:
                    text: "Item #5"

我使用了
FloatLayout
而不是
BoxLayout
,以便将
AppMenu
放在布局的最后,这需要设置
图形的
高度(AppMenu
高度已经固定).

我认为这是布局子元素绘制顺序的结果。当
图形作为布局中的最后一项时,它将在菜单上最后绘制。以下是您的
kv
的修改版本,它将菜单放在布局的最后一位:

FloatLayout:
    id: layout
    Graph:
        size_hint: 1, None
        height: root.height - app_menu.height
        border_color: [0, 0, 0, 0]
        background_color: [0.25, 0.25, 0.25, 1]
    AppMenu:
        id: app_menu
        top: root.height
        cancel_handler_widget: layout

        AppMenuTextItem:
            text: "Menu #1"
            ContextMenu:
                ContextMenuTextItem:
                    text: "Item #11"
                ContextMenuTextItem:
                    text: "Item #12"
        AppMenuTextItem:
            text: "Menu Menu Menu #2"
            ContextMenu:
                ContextMenuTextItem:
                    text: "Item #21"
                ContextMenuTextItem:
                    text: "Item #22"
                ContextMenuTextItem:
                    text: "ItemItemItem #23"
                ContextMenuTextItem:
                    text: "Item #24"
                    ContextMenu:
                        ContextMenuTextItem:
                            text: "Item #241"
                        ContextMenuTextItem:
                            text: "Hello, World!"
                            on_release: app.say_hello(self.text)
                        # ...
                ContextMenuTextItem:
                    text: "Item #5"
我使用了
FloatLayout
而不是
BoxLayout
,以便将
AppMenu
放在布局的最后,这需要设置
图形的
高度(AppMenu
高度已经固定)