0

我尝试使用prompt_toolkit构建命令行/终端应用程序,它应该执行以下操作:

  • 我有一个 (title, id) 对列表,它大到可以放在一个屏幕上,但小到可以放入内存。假设大约 1000 个条目。
  • 为了选择一个项目,我开始打字。在输入时——例如“dog”——列表被过滤到只有那些条目,在标题中有“dog”。
  • 如果列表足够小(但不是空的),我想使用箭头键选择一个条目。
  • 我想让 id 与该标题相关联。

我对 prompt_toolkit 完全陌生,并从两端解决问题:

  1. 使用plain prompt()with autocompletion:我试图滥用自定义完成方法来过滤我的列表,但没有设法显示它。
  2. 我检查了小部件/全屏示例,但文档相当有限。例如,我发现SearchToolbar但无法真正弄清楚它是如何与其他小部件交互的。
  3. 我没有找到任何关于如何显示列表以选择元素的示例。还有更复杂的例子,所以我希望这是可能的,但是迷路了。

有人可以给我指出一个可以解决我的用例之类的问题的例子,或者给我一个总体上如何解决这个问题的起点吗?

4

1 回答 1

1

这是一个快速的自动完成器,可以满足我的想法。这假设第一个字段是唯一的。如果不是,而 ID 是,则切换字典中的键和值。

这将检查元组中的第一项是否与输入文本匹配,并显示第一项和 ID,然后在进行选择时返回 ID。

display 关键字 arg 允许您在自动完成窗口中显示与完成时返回的不同的文本。display_meta 在这里并不是绝对必要的,但它确实显示了选择项目时将返回的内容。

from prompt_toolkit import prompt
from prompt_toolkit.completion import Completer, Completion

data_list = [('Katherine Davis', '105221'),
             ('Brandy Norman', '331005'),
             ('Leah Williams', '326092'),
             ('Veronica Sanchez', '104658'),
             ('Joyce Jackson', '236807'),
             ('Scott Luna', '276109'),
             ('Stephanie Fields', '712971'),
             ('Katie Griffin', '324463'),
             ('Gregory Davis', '626086'),
             ('Michael Mullins', '588486')]


class MyCustomCompleter(Completer):
    def __init__(self, data_list):
        self.data_list = data_list
        self.data_dict = dict(data_list)

    def get_completions(self, document, complete_event):
        matches = [name for name in self.data_dict.keys() if document.text in name]
        for m in matches:
            yield Completion(self.data_dict[m], start_position=-len(document.text_before_cursor), display = m, display_meta = self.data_dict[m])
        
mycompleter = MyCustomCompleter(data_list)

if __name__ == '__main__':
    answer = prompt('>', completer = mycompleter)
    print('ID: %s' % answer)
于 2020-08-27T03:58:29.283 回答