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
的高度已经固定)