You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python FMX GUI应用的Image控件中添加右键上下文菜单?

在DelphiFMX for Python中为Image组件添加右键上下文菜单的方法

我使用DelphiFMX GUI Library for Python创建了一个包含Image的Form,希望为该Image添加右键上下文菜单,右键点击时弹出类似VSCode右键菜单的弹窗。

原创建Form和Image的代码

import os
from delphifmx import *

class frmMain(Form):
    def __init__(self, owner):
        self.Caption = 'My Form with Image and Context Menu'
        self.Width = 1000
        self.Height = 1000

        self.imgDirt = Image(self)
        self.imgDirt.Parent = self
        self.imgDirt.Align = "Client"
        self.imgDirt.Margins.Top = 40
        self.imgDirt.Margins.Left = 40
        self.imgDirt.Margins.Right = 40
        self.imgDirt.Margins.Bottom = 40

        path = os.path.dirname(os.path.abspath(__file__))
        self.imgDirt.Bitmap.LoadFromFile(path + '\dirt.png')


def main():
    Application.Initialize()
    Application.Title = "My Application"
    Application.MainForm = frmMain(Application)
    Application.MainForm.Show()
    Application.Run()
    Application.MainForm.Destroy()

main()

遇到的问题

尝试以下代码时出现报错:NameError: name 'ContextMenu' is not defined

self.cm = ContextMenu(self)
self.cm.Items.Add("Item 1")
self.cm.Items.Add("Item 2")
self.cm.Items.Add("Item 3")

使用self.cm = PopUpMenu(self)也出现同样的未定义错误。

解决方案

在DelphiFMX for Python中,右键菜单对应的正确组件是PopupMenu(注意大小写:首字母P大写,U大写),需要通过MenuItem创建具体菜单项,并将菜单关联到Image的PopupMenu属性上。

完整修改后的代码

import os
from delphifmx import *

class frmMain(Form):
    def __init__(self, owner):
        self.Caption = 'My Form with Image and Context Menu'
        self.Width = 1000
        self.Height = 1000

        self.imgDirt = Image(self)
        self.imgDirt.Parent = self
        self.imgDirt.Align = "Client"
        self.imgDirt.Margins.Top = 40
        self.imgDirt.Margins.Left = 40
        self.imgDirt.Margins.Right = 40
        self.imgDirt.Margins.Bottom = 40

        path = os.path.dirname(os.path.abspath(__file__))
        self.imgDirt.Bitmap.LoadFromFile(path + '\dirt.png')

        # 创建右键菜单实例
        self.popup_menu = PopupMenu(self)
        self.popup_menu.Parent = self

        # 创建并添加菜单项
        # 菜单项1:复制
        item_copy = MenuItem(self)
        item_copy.Text = "复制"
        item_copy.OnClick = self.handle_menu_click
        self.popup_menu.Items.Add(item_copy)

        # 菜单项2:保存图片
        item_save = MenuItem(self)
        item_save.Text = "保存图片"
        item_save.OnClick = self.handle_menu_click
        self.popup_menu.Items.Add(item_save)

        # 菜单项3:退出
        item_exit = MenuItem(self)
        item_exit.Text = "退出"
        item_exit.OnClick = self.handle_menu_click
        self.popup_menu.Items.Add(item_exit)

        # 将菜单绑定到Image组件
        self.imgDirt.PopupMenu = self.popup_menu

    def handle_menu_click(self, sender):
        # 处理菜单项点击事件
        ShowMessage(f"您点击了:{sender.Text}")

def main():
    Application.Initialize()
    Application.Title = "My Application"
    Application.MainForm = frmMain(Application)
    Application.MainForm.Show()
    Application.Run()
    Application.MainForm.Destroy()

main()

关键要点说明

  • 组件名称必须准确:DelphiFMX中右键菜单的组件是PopupMenu,而非ContextMenu或PopUpMenu(注意大小写)
  • 菜单项需要通过MenuItem类创建,设置Text属性定义显示文字,OnClick属性绑定点击事件处理函数
  • 将创建好的PopupMenu赋值给Image的PopupMenu属性,右键点击Image时就会自动弹出菜单
  • 可以在点击事件处理函数中实现具体的业务逻辑,比如复制图片、保存图片等操作

内容的提问来源于stack exchange,提问作者Shaun Roselt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:53:17