使用 Python Rich 在布局内获取提示

2024-01-31

是否可以使用提示获取用户输入within使用 Python Rich 的布局元素?

我的目标是使用 Rich 的 Layout 构建一个具有 4 个窗格的全屏窗口。顶部 3 个包含标题、成分和方法,效果很好,但我希望底部一个包含用户输入的提示。

期望的输出:

用户输入的文本显示在布局的底部面板内。

┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                                                                                                   │
│ Chocolate cheesecake                                                                                              │
│                                                                                                                   │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
┌──────────────── 'ingredients' (58 x 7) ────────────────┐┌─────────────────── 'method' (59 x 7) ───────────────────┐
│                                                        ││                                                         │
│                                                        ││                                                         │
│               Layout(name='ingredients')               ││                  Layout(name='method')                  │
│                                                        ││                                                         │
│                                                        ││                                                         │
└────────────────────────────────────────────────────────┘└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────── Search for a recipe ───────────────────────────────────────────────┐
│                                                                                                                   │
│  > :                                                                                                              │
│                                                                                                                   │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

我的尝试:

from rich import print
from rich.panel import Panel
from rich.layout import Layout
from rich.prompt import Prompt

def rich_ui():
    while True:
        layout = Layout()
        layout.split_column(
            Layout(name="banner"),
            Layout(name="recipe"),
            Layout(name="search")
        )

        layout['banner'].update(Panel('Chocolate cheesecake', padding=1))
        layout['banner'].size = 5

        layout['recipe'].split_row(
            Layout(name="ingredients"),
            Layout(name="method")
        )

        layout['search'].update(Panel(Prompt.ask('> '), title='Search for a recipe'))
        layout['search'].size = 5
        print(layout)

if __name__ == '__main__':
    rich_ui()

实际输出:

注意提示的>:位于布局部分之外。

┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                                                                                                   │
│ Chocolate cheesecake                                                                                              │
│                                                                                                                   │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
┌──────────────── 'ingredients' (58 x 7) ────────────────┐┌─────────────────── 'method' (59 x 7) ───────────────────┐
│                                                        ││                                                         │
│                                                        ││                                                         │
│               Layout(name='ingredients')               ││                  Layout(name='method')                  │
│                                                        ││                                                         │
│                                                        ││                                                         │
└────────────────────────────────────────────────────────┘└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────── Search for a recipe ───────────────────────────────────────────────┐
│                                                                                                                   │
│                                                                                                                   │
│                                                                                                                   │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
> :

这也是可能的,而且可以说更容易做到Textual https://github.com/Textualize/textual如果您愿意将其用于基于文本的 GUI。我喜欢它来满足我的需要,但是@威尔·麦古根 https://stackoverflow.com/users/673463/will-mcgugan可能对 Textual 的未来有话要说。

您只需实现一个新的小部件作为文本输入控件,但对于一个简单的小部件来说,代码并不多。您可以使用 Textual 本身的键盘输入机制。

像这样的东西:

class InputBox(Widget):
    """takes typed input mostly for debugging"""
    has_focus: Reactive[bool] = Reactive(False)
    style: Reactive[str] = Reactive("")
    height: Reactive[int or None] = Reactive(None)
    text: Reactive[str] = Reactive("")

    def __init__(self, *, name: str or None = None, height: int or None = None, callback: Callable[[str], None] = None) -> None:
        super().__init__(name=name)
        self.height = height
        self.callback = callback

    def render(self) -> Panel:
        return Panel(
            self.text,
            title=self.name,
            box=box.HEAVY if self.has_focus else box.ROUNDED,
            style="cyan" if self.has_focus else "dim white",
            height=self.height,
            highlight=True
        )

    async def on_focus(self, event: events.Focus) -> None:
        self.has_focus = True

    async def on_blur(self, event: events.Blur) -> None:
        self.has_focus = False

    async def on_key(self, event: events.Key) -> None:
        """Handle key presses."""
        self.log(event)
        if event.key == "ctrl+h":
            self.text = self.text[:-1]
        elif event.key == "enter":
            # process input
            if self.callback:
                self.callback(self.text)
            self.text = ""
        elif len(event.key) == 1:
            self.text += str(event.key)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python Rich 在布局内获取提示 的相关文章

随机推荐

  • 如何知道 python-docx 中的新段落何时导致新页面

    我必须使用动态创建Word文档python docx 我通过动态添加表行来实现这一点 并且无法知道页面上适合多少条记录 因为这取决于特定的数据 我需要知道添加到文档 表行或段落 的新元素何时会导致新页面 因此我可以根据每个页面包含的信息在数
  • 通过融合查看分支的差异?

    我知道我可以查看 HEAD 和当前状态之间的差异meld 但是我如何查看分支之间的差异 例如master and devel与融合 目前我执行以下步骤 重命名工作副本的文件夹例如mv projectA projectA master 再次克
  • 有没有办法在 Python 中推断日期是否是 DST(夏令时)更改的实际日期?

    我想在Python中推断日期是否是一年中由于DST 夏令时 而改变小时的实际日期 与图书馆pytz您可以本地化日期时间 并且实际的 DST 更改已正确完成 此外 还有一个方法dst 图书馆的datetime这使您可以推断实际日期是夏季还是冬
  • iOS 设备上安装的所有应用程序的列表及其在主屏幕 (Springboard) 上的位置

    我几天来一直在寻找有关如何获取运行 iOS gt 5 0 的设备上已安装应用程序列表的下降答案 com apple mobile installation plist 我尝试过来自不同来源的代码 我得到的唯一几乎成功的解决方案是使用 Dan
  • 是否可以解耦 Eclipse 的代码索引功能?

    我正在寻找为大学课程编写一个静态分析器 为了为该工具提供更多功能 我希望能够查找调用层次结构 如 Eclipse 中的 Ctrl Alt H 所做的那样 这也必须是一个快速操作 因此查找可能必须针对索引而不是字节码扫描来完成 然而 我认为编
  • Jquery 无法读取 Internet Explorer 上的自定义标记文本

    我想在我的 html 页面中使用自定义标签并使用 jquery 读取其中的文本 就像是
  • 合并可跨越对象时出错

    我想合并 3 个可跨越的对象 这段代码工作正常 Spannable s1 new SpannableStringBuilder bold s1 setSpan new StyleSpan android graphics Typeface
  • 扩展FutureTask,如何处理取消

    我已经延长了FutureTask from java util concurrent提供回调来跟踪提交给任务的执行情况ExecutorService public class StatusTask
  • git 仅在 Gitlab CI 上克隆 LFS 文件的 sha

    我推了 png文件 每个文件大小为 2 MB 并由git lfs 到我的 gitlab com 存储库 比如说repo a 在另一个仓库的 CI 工作中repo b where git lfs安装后 repo a 被克隆 现在我看到所有 p
  • 如何通过 pkg-config 使用 C++ Boost 库?

    我成功编译并安装了最新版本的 Boost 库到我的 Linux 机器上 现在 我希望能够使用 pkg config 来简化提供 GCC 链接参数的过程 由于我懒得手动编码自己的 pc 文件 是否有一个脚本 工具可以自动生成所需的 pc 文件
  • 有什么方法可以使用 exe 文件执行我的 Node js 和 puppeteer 程序吗?

    当我在 CMD 上使用该程序时 该程序在 puppeteer 上运行良好 尽管如此 这是一个漫长的过程 对于任何非技术人员来说也很复杂 我想制作一个 exe 文件来执行我手动执行的任务 以在 CMD 中运行此 node js 文件 正如您首
  • Azure Active Directory 注销或清除本机应用程序的令牌缓存

    我有一个 C Web API REST 服务后端 我为 CMS 网页和 Angular2 应用程序提供服务 这是相关的 Angular 应用程序需要通过后端发送用户名和密码 原始凭据 进行身份验证 后端使用这些向 Azure Active
  • 尽管时间戳是正确的,但 date() 返回错误的日期!

    我的 php 日期函数有一个奇怪的问题 code numDays 8 date strtotime 2010 11 06 for i 1 i lt numDays i thisDay date D d M Y date print this
  • Java HTML 渲染“pt”与“px”大小

    我遇到了在 JLabel 中指定 html 元素宽度的问题 我想我应该在此处的旗杆上运行它 看看是否有人有任何建议 当我使用 px 单位值指定元素的宽度时 结果大小实际上约为 133 而如果我不使用单位或使用 pt 我会得到我指定的确切大小
  • 如何在 Django 中创建对话收件箱

    我有一个Message类有fromUser toUser text and createdAt fields 我想模仿 Whatsapp 或 iMessage 或任何 SMS 收件箱 这意味着我想获取每个对话的最后一条消息 I tried
  • 查找并发、重叠、日期范围的数量

    我有一个多年来一直试图解决的难题 但它完全超出了我的能力范围 我有一个包含 3 列的电子表格 A 列是讲师 ID 号 B 列是他们的课程开始日期 C 列是他们的课程结束日期 每个讲师 ID 都有多个课程 我基本上是想回答这个问题 这位讲师在
  • 独立于平台的资源系统(如 Qt Resource 系统)

    是否有一个类似于 Qt 附带的 C 平台独立资源系统 但没有 Qt 依赖项 我想从我的 C 源代码中访问任意数据 也就是说 不仅是图标 还包括翻译或着色器等 或者某种虚拟文件系统库来访问 例如ZIP 压缩文件或类似文件也能满足我的需要 我为
  • 检查视口中的可见性(puppeteer)

    如何使用 Puppeteer 检查 HTML 元素在视口 可见区域 内是否可见 例如 如果我必须滚动才能看到一个按钮 那么它就不可见 page waitForSelector element visible true page waitFo
  • 正则表达式前瞻、后瞻和原子组

    我在我的正则表达式体内发现了这些东西 但我不知道我可以用它们做什么 有人有例子 以便我可以尝试理解它们是如何工作的吗 positive lookahead negative lookahead lt positive lookbehind
  • 使用 Python Rich 在布局内获取提示

    是否可以使用提示获取用户输入within使用 Python Rich 的布局元素 我的目标是使用 Rich 的 Layout 构建一个具有 4 个窗格的全屏窗口 顶部 3 个包含标题 成分和方法 效果很好 但我希望底部一个包含用户输入的提示