作为主题,我试图发送句柄,以便匿名函数可以与GUI的其余部分交互。然而,当查看匿名函数中的输入时,它们是空的。
在这里将函数添加到GUI:
x=5;
y=3;
z=4;
set(gca,'ButtonDownFcn', @(y,z,x)mousecontroll_callback)
Inside函数会对你点击的内容做出反应,但它不能读取y,z或x
function mousecontroll_callback(y,z,x)
...
当运行这个GUI时,我得到这个错误消息,它是从另一个名为otherGUI的GUI调用的"使用screenmode>screenmode_OutputFcn时出错输入参数太多。
gui_mainfcn中的错误(第265行)函数宏指令(gui_State。gu_outputfcn, gu_hfigure, [],gui_Handles);
屏幕模式错误(第42行)gui_mainfcn (gui_State变长度输入宗量{:});
otherGUI>全屏错误(第1031行)screenmode(图像、范围);计算ui回调时出错-然而,当不搞乱输入到匿名函数,并试图访问他们的代码运行。
我不想再使用全局变量了,有人知道如何让这个函数得到x,y,z,以后会是句柄吗?
试试这个:
set(gca,'ButtonDownFcn', { @mousecontroll_callback , x,y,z} );
...
function mousecontroll_callback(hObj,evt,x,y,z)
end
{}
语法让Matlab知道你想传递额外的变量。
注意,x
, y
和z
值将作为闭包上下文的一部分被冻结,即使您更新它们也将是相同的。如果您想这样做,则需要找到另一个解决方案,例如:
- 使用
guidata
全局数据存储来传输结构体(像Guide一样)-最流行的解决方案。 - 创建自己的
handle
对象,该对象将传递给所有函数 - 使用全局变量
- 使用嵌套函数,类似于使用全局变量
你的代码中有一个错误,这意味着它没有做你认为的事情。
x=5;
y=3;
z=4;
set(gca,'ButtonDownFcn', @(y,z,x)mousecontroll_callback)
你有上面的代码,我猜你希望在按下按钮时执行以下命令:
mousecontroll_callback(3,4,5);
实际上,通过将参数紧接在@
符号之后,您实际上创建了一个包装器函数,如下所示(baz
)
x=5;
y=3;
z=4;
set(gca,'ButtonDownFcn', @baz)
function foo = baz(b,c,a)
mousecontroll_callback
end
如果你使用下面的代码,它应该能正常工作:
set(gca,'ButtonDownFcn', @() mousecontroll_callback(y,z,x));
我还建议看一下MathWorks关于匿名函数的文档