0

我的目标是包装 Urwid 的文本小部件以创建我自己的自定义小部件。为此,我需要将文本小部件包装在 Filler 小部件中,以便将其呈现为正确的大小。

使用此示例代码,我希望在我的屏幕上看到“测试”,然后如果它们是“wasd”之一,我按下的键。相反,我什么也没看到。日志记录告诉我我在按键中点击了我的代码,之前的调试显示我正在点击render()文本小部件的功能并返回正确的值。

import logging
import urwid

logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
logger = logging.getLogger(__name__)


class TestWidget(urwid.WidgetWrap):
    def __init__(self):
        self.text_widget = urwid.Text("test")
        super().__init__(urwid.Filler(self.text_widget, valign='top', height='flow'))
        self._selectable = True

    def selectable(self):
        return self._selectable

    def keypress(self, size, key):
        if key in ('w', 's', 'a', 'd'):
            logger.info(key)
            self.text_widget.set_text(key)
        else:
            return key

def show_or_exit(key):
    if key in ('q', 'Q'):
        raise urwid.ExitMainLoop()

if __name__ == '__main__':
    logger.info("Starting")
    wid = TestWidget()
    loop = urwid.MainLoop(wid, unhandled_input=show_or_exit, handle_mouse=True)
    loop.run()
4

1 回答 1

0

嗯。我看不出代码有什么问题,当我在 Python 3.5.2 和 Urwid 2.1.2 和 Urwid 1.3.1 中运行它时它对我有用(我都试过了)。我看到一行显示“test”,在按键后切换为显示“w”等。

(我不得不删除 basicConfig 的 encoding 关键字参数,但这似乎与 Urwid 无关)。

你用的是什么版本的 Python 和 Urwid?

于 2021-01-31T16:31:29.337 回答