使用npyscreen时curses.KEY_UP与KEY_DOWN按键绑定不生效问题
问题根因
npyscreen 的表单默认会将上下方向键用于内部控件的焦点切换,按键事件被默认逻辑消费后,不会触发表单层面自定义的绑定函数。你代码中添加的FixedText控件默认支持聚焦,所以按下方向键时会先触发焦点移动逻辑,不会走到你绑定的add_one、minus_one方法。
解决方案
方案1(适配当前静态文本场景)
直接禁用所有静态文本控件的聚焦能力,让方向键事件可以传递到你自定义的按键处理器,仅需要在添加FixedText时传入focusable=False参数即可,修改后完整代码如下:
import npyscreen, curses index = 0 class MyTestApp(npyscreen.NPSAppManaged): def onStart(self): self.registerForm("MAIN", MainForm()) class MainForm(npyscreen.Form): def create(self): for i in range(10): # 新增focusable=False禁用控件聚焦能力 self.add(npyscreen.FixedText, value='message:'+str(i), focusable=False) self.add_handlers({"^R": self.spawn_notify_popup, curses.KEY_UP: self.minus_one, curses.KEY_DOWN: self.add_one}) def add_one(self, key): global index if(index < 30): index+=1 def minus_one(self, key): global index if(index > 0): index-=1 def spawn_notify_popup(self, code_of_key_pressed): message_to_display = 'I popped up passed: {}'.format(index) npyscreen.notify_confirm(message_to_display, title= 'title') def afterEditing(self): self.parentApp.setNextForm(None) if __name__ == '__main__': TA = MyTestApp() TA.run()
修改完成后按上下方向键调整索引,再按Ctrl+R触发弹窗,即可看到索引值已经正常变更。
方案2(保留控件焦点切换能力)
如果后续需要给表单添加可交互控件、需要保留默认的焦点切换逻辑,可以重写表单的keypress方法优先拦截方向键事件,不需要修改控件属性,代码示例如下:
class MainForm(npyscreen.Form): def create(self): for i in range(10): self.add(npyscreen.FixedText, value='message:'+str(i)) self.add_handlers({"^R": self.spawn_notify_popup}) # 重写keypress方法优先处理方向键 def keypress(self, size, key): if key == curses.KEY_UP: self.minus_one(key) return elif key == curses.KEY_DOWN: self.add_one(key) return # 其余按键走默认处理逻辑 super().keypress(size, key) # 其余方法保持不变
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

