如何在Python FMX GUI应用的Form上获取鼠标光标位置?
解决DelphiFMX for Python中Form MouseMove事件无法触发及Caption不更新的问题
我使用DelphiFMX GUI Library for Python构建了一个简单的Form,并为其绑定了MouseMove事件。我希望在鼠标移动时获取Form上的X、Y坐标,并将坐标显示在Form的Caption中。
我尝试了以下代码,但无法正常工作:
from delphifmx import * class frmMain(Form): def __init__(self, owner): self.Width = 800 self.Height = 500 self.Caption = "Mouse Position: <X, Y>" self.MouseMove = self.FormMouseMoveEvent def FormMouseMoveEvent(self, sender, e): self.Caption = "Mouse Position: <" + e.X + ", " + e.Y + ">" def main(): Application.Initialize() Application.Title = "My Application" Application.MainForm = frmMain(Application) Application.MainForm.Show() Application.Run() Application.MainForm.Destroy() main()
Form的Caption始终没有变化,一直显示“Mouse Position: <X, Y>”
更新:
我怀疑MouseMove事件未正常触发,于是将代码修改为如下,但Caption仍然没有更新:
def FormMouseMoveEvent(self, sender, e): self.Caption = "Just changing the caption"

解决方案
在DelphiFMX的Python绑定中,不能直接通过赋值的方式绑定事件,需要使用Bind方法来正确注册事件处理器。另外,e.X和e.Y是整数类型,直接与字符串拼接会报错,需要先转换为字符串。
修正后的完整代码如下:
from delphifmx import * class frmMain(Form): def __init__(self, owner): self.Width = 800 self.Height = 500 self.Caption = "Mouse Position: <X, Y>" # 使用Bind方法绑定MouseMove事件 self.MouseMove.Bind(self.FormMouseMoveEvent) def FormMouseMoveEvent(self, sender, e): # 将整数坐标转为字符串后拼接 self.Caption = f"Mouse Position: <{str(e.X)}, {str(e.Y)}>" def main(): Application.Initialize() Application.Title = "My Application" Application.MainForm = frmMain(Application) Application.MainForm.Show() Application.Run() Application.MainForm.Destroy() main()
关键修改说明:
- 事件绑定:将
self.MouseMove = self.FormMouseMoveEvent替换为self.MouseMove.Bind(self.FormMouseMoveEvent),这是DelphiFMX Python绑定中注册事件的标准方式,确保事件触发时能正确调用处理函数。 - 类型转换:使用
str()将e.X和e.Y的整数类型转为字符串,避免字符串与整数拼接时的类型错误。
运行修正后的代码,鼠标在Form上移动时,Caption会实时更新显示当前的坐标位置。
内容的提问来源于stack exchange,提问作者Shaun Roselt
相关产品推荐
相关产品推荐

