【问题标题】:How to call a button's callback when pressing on another button in MATLAB GUI? [duplicate]在 MATLAB GUI 中按下另一个按钮时如何调用按钮的回调? [复制]
【发布时间】:2019-07-12 15:52:07
【问题描述】:

假设我在 MATLAB GUI 上有两个按钮。当我按下pushMain时,我想调用pushChild按钮的回调。

function pushChild_Callback(hObject, eventdata, handles)
handles.A = 1;
guidata(hObject,handles);

function pushMain_Callback(hObject, eventdata, handles)
handles.B = 2;
pushChild_Callback(handles.pushChild, eventdata, handles) % option 1
pushChild_Callback(hObject, eventdata, handles) % option 2
guidata(hObject,handles);

在这两个选项中,当我按下 pushMain 按钮时,它会进入 pushChild_Callback 函数。但是,它不会保存 handles.A 的值。就在它离开 pushChild_Callback 函数之后,handles.A 变成了空的,就像我以前从未填充过它一样。因此,我将问题与 pushChild_Callback 函数中的 guidata 命令相关联。它不会将句柄保存到正确的位置..

【问题讨论】:

  • 不要不要转发问题。您之前的问题仍然有效。编辑问题以改进它们,不要重复自己。至少删除旧问题,因为这个问题有答案,你举了一个更好的例子。
  • 你是怎么断定我重复自己的?我正在开发一个包含 5000 多行代码和许多功能的 GUI。这些是单独的问题,我需要它们在不同的部分;对于代码上具有回调函数的两个直接按钮和一个直接按钮,一个由代码生成的按钮。我试图让我的问题尽可能简单并在这里输入..
  • 这两个问题的问题完全相同——从另一个按钮的回调中调用一个按钮的回调。我看不出解决一个问题如何不能同时解决两个问题,而且您使用的语法在两者中都非常相似。您是这里的新用户,我只是建议预期的行为和网站使用。
  • 我坚持这是一个不同的问题。我在这里得到了答案,但仍在寻找另一个答案。你能把“这个问题在这里可能已经有答案”的标志去掉吗,因为它没有。

标签: matlab user-interface


【解决方案1】:

当您将句柄数据保存在pushMain_Callback 中时,您将覆盖pushChild_Callbackhandles 所做的更改。这是因为 MATLAB 按值而不是按引用存储 handles。当您调用pushChild_Callback 时,您只是在此函数的范围内设置handles.A 的值。当您返回到pushMain_Callback 的范围时,句柄的本地副本没有handles.A 的任何值。因此,当您在pushMain_Callback 中调用guidata(hObject,handles) 时,您将使用未设置handles.A 的版本覆盖handles

调用子函数后,您需要刷新handles 数据。我建议如下:

function pushChild_Callback(hObject, eventdata, handles)
handles.A = 1;
guidata(hObject,handles);

function pushMain_Callback(hObject, eventdata, handles)
handles.B = 2;
pushChild_Callback(hObject, eventdata, handles)
handles = guidata(hOject);

编辑:

基本上,guidata(hObject,handles) 是一个 write 命令,将handles 的值写入hObject 结构。 handles = guidata(hObject) 是一个read 命令——它读取存储在hObject 中的数据并将其存储在变量handles 中。我将尝试逐步解释发生了什么。

当您第一次调用pushMain 时,handles.B 被设置为 2,变量的状态如下所示:

pushMain: handles = {A = [], B = 2}
hObject: handles = {A = [], B = []}
pushChild: handles = {A = [], B = []}

当您调用pushChild 时,您将来自pushMainhandles 对象传递给它,所以最初它看起来像这样:

pushMain: handles = {A = [], B = 2}
hObject: handles = {A = [], B = []}
pushChild: handles = {A = [], B = 2}

然后,handles.A 设置为 1。这只会更新 pushChild 内的 handles 的值 -- pushMain 不受影响,因为它的范围不同:

pushMain: handles = {A = [], B = 2}
hObject: handles = {A = [], B = []}
pushChild: handles = {A = 1, B = 2}

然后我们调用guidata(hObject,handles),它会更新hObject存储的handles的值:

pushMain: handles = {A = [], B = 2}
hObject: handles = {A = 1, B = 2}
pushChild: handles = {A = 1, B = 2}

控制权现在传回pushMain。请注意,pushMain 中的handles 的值更新,因此handles.A 仍然为空。这意味着如果我们调用guidata(hObject,handles),我们设置hObject.handles.A = [],这显然不是我们想要的。相反,我们必须通过调用handles = guidata(hObject) 来更新handles 的值。因此:

pushMain: handles = {A = 1, B = 2}
hObject: handles = {A = 1, B = 2}
pushChild: handles = {A = 1, B = 2}

【讨论】:

  • 首先,非常感谢,它解决了我的问题。但是,我无法理解这里的逻辑。 guidata(hObject) 和 guidata(hObject, 句柄) 有什么区别?因为我在 pushMain 上的句柄也发生了变化。除非我输入 guidata(hObject, handles),否则它如何保存句柄?
  • 解释太长,无法放在评论中,因此我编辑了答案以尝试解释问题。
  • 我对 hObject 感到困惑。不是当前对象吗?例如,当代码在 pushMain 上时,hObject 是 pushMain 按钮,当它在 pushChild 上时,hObject 是 pushChild 按钮。我认为句柄是更通用的东西,因为当运行的代码在 pushMain 的回调中时,hObject 与handles.pushMain 是一样的。
猜你喜欢
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多