【问题标题】:How does urwid handle keypress hierarchy?urwid 如何处理按键层次结构?
【发布时间】:2020-12-04 16:33:02
【问题描述】:

我正在为文字冒险游戏构建 UI。我希望我最上面的小部件能够处理简单快捷方式的按键。例如,“输入”以打开输入字段。但如果输入字段是当前焦点小部件,我希望“输入”按键发出连接信号。

有没有办法将按键传递给当前焦点小部件,而无需容器先处理它?我能想到的唯一解决方案如下:

class UserInput(urwid.Edit):
    
    signals = ['submit']
    
    def __init__(self):
        super().__init__(u">> ", wrap='clip')
    
    def keypress(self, size, key):
        if key == 'enter':
            self._emit('submit')
        else:
            super().keypress(size, key)

class Container(urwid.Frame):
    
    def keypress(self, size, key):
        # pass keys with double binding if focus widget is input field
        if isinstance(self.focus, urwid.Edit):
            pass
        else:
            # Move Player
            if key in ['w', 'a', 's', 'd', 'q', 'e']:
                self.handle_userInput(key)
            # Append input field to bottom of ListWalker
            elif key in [' ', 'enter']:
                self.textBox.show_inputField()
            ...
    
        # Open Menu in side panel
        if key == 'esc':
            self.switch_infoTab('menu')
        # pass unhandled keys to base class method
        else:
            super().keypress(size, key)

我认为Container.keypress 开头的类型检查很笨拙。一个更好的解决方案的提示将不胜感激。

【问题讨论】:

    标签: python keypress urwid


    【解决方案1】:

    如果正确理解 Urwid 这应该是可能的!想想箭头键在嵌套的小部件层次结构中的导航作用。

    示例:假设有一个包含两个 Edit 小部件的 Columns 小部件,并且第一个 Edit 具有焦点。当您按右时,光标将在“编辑”小部件中逐步遍历字符串,直到您到达末尾。然后焦点将转移到第二个编辑小部件。

    这是如何工作的? keypress 方法有一个返回值。如果它返回None,则表示小部件处理了按键操作。如果返回 key 值,则表示它没有处理按键操作。编辑小部件在小部件内移动光标时返回None。一旦到达终点,它就会开始返回key。 Columns 小部件尝试在其焦点小部件上调用keyprees。如果它返回None,那么它就完成了。如果它返回一个键,那么 Columns 小部件会将焦点转移到下一个子级。

    因此,在您的情况下,您可以在 Container 小部件中当前聚焦的小部件上调用 keypress。如果它返回key 并且键是'enter' 那么你可以启动一个新的输入字段。

    我从以下页面了解到这一点:http://urwid.org/manual/widgets.html(请参阅“然后以这种方式处理键盘输入:”部分)。

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多