如何在Matlab/Octave绘图窗口获取键盘输入的具体字符?
解决方案
你需要的绘图窗口专属键盘输入功能,可直接通过waitforbuttonpress()配合图形窗口的CurrentCharacter属性实现,完全不需要从控制台捕获输入,同时可以直接移除嵌套循环,自然解决双重break的问题:
- 当
waitforbuttonpress()返回值为1时,代表触发事件是键盘按下,此时调用get(gcf, 'CurrentCharacter')即可获取到具体按下的字符,仅当前激活的绘图窗口的按键会被捕获 - 直接用单
while循环替代原有嵌套循环,不需要多层退出逻辑
完整可运行代码
clf; colormap ("default"); filename_orig = "./orig.data"; load("-text", filename_orig, "M"); % 初始化参数:Octave数组索引从1开始,t最大值为时间维度总长度 t = 1; t_max = size(M, 3); h = imagesc (M(:,:,t)); title ("Test data"); xlabel ("x"); ylabel ("y"); # 单循环实现按键控制,无嵌套自然不需要双重break while(1) % 刷新帧内容和标题 title(["Test data; t = ", num2str(t)]); set(h, 'cdata', M(:,:,t)); pause(0.05); % 仅需保证绘图刷新即可,不需要过长等待 % 等待按键/鼠标点击事件 is_keyboard = waitforbuttonpress(); % 忽略鼠标点击事件,只响应键盘输入 if ~is_keyboard continue; endif % 读取按下的具体字符 key = get(gcf, 'CurrentCharacter'); % 按键逻辑处理 switch key case '+' % 按+向前切帧,超过最大值跳回第一帧 t = t + 1; t = t > t_max ? 1 : t; case '-' % 按-向后切帧,小于1跳回最后一帧 t = t - 1; t = t < 1 ? t_max : t; case 'q' % 按q直接退出循环 break; endswitch end
补充说明
操作时保持绘图窗口为激活状态即可捕获按键,你也可以根据需求修改按键映射规则,比如替换为方向键控制,只需要读取按键对应的KeyCode属性判断即可。
内容的提问来源于stack exchange,提问作者Pietro
相关产品推荐
相关产品推荐

