【问题标题】:WindowKeyPressFcn stops being calledWindowKeyPressFcn 停止被调用
【发布时间】:2015-01-19 04:21:04
【问题描述】:

我正在对 EEGlab 的 eegplot 函数(如 vim 风格的导航等)进行一些修改,这些修改需要通过 WindowKeyPressFcn 工作。
但是,由于某种原因没有调用回调。我已经调试这个问题一段时间了,有点迷茫。我正在寻找可能出现问题的建议。不幸的是,eegplot 函数很大、很复杂而且有些复杂,我无法在一个简单的例子中重现这个问题。因此,我正在寻找关于为什么 WindowKeyPressFcn 中明显存在的函数句柄可能会在某些时候停止使用的一般建议。

这是我到目前为止所学到的:

  • 如果我在eegplot 中进入调试模式(在设置函数[eegplot 的前半部分] 附近设置一个断点)我可以运行WindowKeyPressFcn 至少一次。
  • 但是 - 函数在调试期间的某个时间点停止调用(有时甚至在仅调用一次之后)。
  • 如果我在没有调试的情况下运行eegplot(即等待它完成并将控制权返回给我)我无法通过按键调用WindowKeyPressFcn。函数句柄仍然存在于图窗的WindowKeyPressFcn 属性中。
  • 当我按下一个键时WindowKeyPressFcn没有被使用时,我仍然可以调用它:

    figh = gcf;
    fun = get(figh, 'WindowKeyPressFcn');
    ev.Key = 'rightarrow';
    ev.Character = ' ';
    ev.Modifier = [];
    feval(fun, figh, ev);
    

所以可以说函数句柄是“健康的”,但由于某种原因,当按下一个键并且图形具有焦点时,它不再被使用。什么时候以及为什么会发生这样的事情?关于我应该检查以了解此问题的任何想法?

更新
我发现WindowKeyPressFcn回调有时会被一些窗口监听器阻塞,并尝试了以下解决方案:

hManager = uigetmodemanager(gcf);
set(hManager.WindowListenerHandles,'Enable','off');

它不起作用 - 当我按下一个键时,仍然没有调用 WindowKeyPressFcn。 :(

更新 2
另一件事不起作用:

chld = get(gcf, 'Children');
tp = get(chld, 'type');
chld = chld(strcmp(tp, 'uicontrol'));
set(chld, 'KeyPressFcn', @eegplot_readkey_new)

eegplot_readkey_new 是我用来响应按键的函数)

更新 3
还有一个不工作:

addlistener(gcf, 'WindowKeyPress', @eegplot_readkey_new);

【问题讨论】:

    标签: matlab user-interface eeglab


    【解决方案1】:

    好的 - 我想通了,尽管解决方案至少可以说很奇怪。 出于某种神秘的原因,使用 linesmoothing undocummented 属性会阻止调用 WindowKeyPressFcn。我完全不知道为什么......

    【讨论】:

      猜你喜欢
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      相关资源
      最近更新 更多