python 如何在简单的Text对象中添加click事件?

piah890a  于 2023-01-01  发布在  Python
关注(0)|答案(2)|浏览(308)

我正在尝试获取它,以便在Textual呈现的文本中添加链接。
我的文本可能有多个链接,例如:

Hello [@click=hello]World[/] there, how are you?
This is a test of [@click=more] more info[/] being clickable as well.

在我制作的这个简单示例中,单击单词“World”应该会将背景颜色更改为红色,但它不起作用。
注:我还绑定了“b”键做几乎相同的事情,所以我可以看到它的工作,它应该改变背景色,和应用程序的副标题。

import os
import sys
from rich.console import RenderableType
from rich.panel import Panel
from rich.text import Text
from textual.app import App
from textual.widgets import Header, Footer, ScrollView
from textual.widgets import Placeholder

class MyApp(App):

    async def on_load(self) -> None:
        await self.bind("b", "color('blue')")

    async def on_mount(self) -> None:
        await self.view.dock(Header(), size=5, edge="top")
        await self.view.dock(Footer(), edge="bottom")
        await self.view.dock(ScrollView(Panel("Hello [@click=hello]World[/] more info here")), edge="top")

    async def action_color(self, color:str) -> None:
        self.app.sub_title = "KEYBOARD"
        self.background = f"on {color}"

    async def action_hello(self) -> None:
        self.app.sub_title = "CLICKED"
        self.background = "on red"

MyApp.run(title="Test click", log="textual.log")

我在textual discussions和最初丰富的讨论中问过同样的问题,但还没有从我收到的反馈中看到如何使这个工作,这当然是有帮助的,但我在这里错过了一些东西,所以感谢任何输入。

xqnpmsa8

xqnpmsa81#

看起来@click=action在文本中不起作用(至少我根本不能使它起作用)。
在挖掘了丰富的文档之后,我发现了Text类。那个类,有一个方法,可以创建click回调。
它支持__add__,因此您可以将多个Text+运算符连接在一起。
第二个难题是找出设置click回调的内容,我再次查看源代码并在app.py中找到_action_targets,其中包含{"app", "view"}设置。
把所有这些放在一起,你可以使用Texton(click="app.callback()")创建链接,这将调用MyApp类的action_callback方法(文本应用程序的示例)。然后通过将其他Text和链接合并在一起来创建最终的面板文本。
下面是一个工作示例,将背景设置为红色,单击Hello或绿色,单击World。

from rich.panel import Panel
from rich.text import Text
from textual.app import App
from textual.widgets import Header, Footer, ScrollView

class MyApp(App):

    async def on_load(self) -> None:
        await self.bind("b", "color('blue')")

    async def on_mount(self) -> None:
        await self.view.dock(Header(), size=5, edge="top")
        await self.view.dock(Footer(), edge="bottom")
        link1 = Text("Hello").on(click="app.hello()")
        link2 = Text("World").on(click="app.world()")
        panel_text = link1 + " " + link2 + Text(" more info here")
        await self.view.dock(ScrollView(Panel(panel_text)), edge="top")

    async def action_color(self, color: str) -> None:
        self.app.sub_title = "KEYBOARD"
        self.background = f"on {color}"

    async def action_hello(self) -> None:
        self.app.sub_title = "CLICKED Hello"
        self.background = "on red"

    async def action_world(self) -> None:
        self.app.sub_title = "CLICKED World"
        self.background = "on green"

MyApp.run(title="Test click", log="textual.log")

我知道这不是个理想的解决办法,但这是我能得到你想要的最接近的办法.

aiazj4mn

aiazj4mn2#

也可以使用Text.assemble()创建具有不同属性的文本:

async def on_mount(self) -> None:
    await self.view.dock(Header(), size=5, edge="top")
    await self.view.dock(Footer(), edge="bottom")
    panel_text = Text.assemble(
        "Hello ",
        Text("World","dark_blue u").on({"@click" : "app.hello()"}),
        " more ",
        Text("info","dark_blue u").on({"@click" : "app.color('blue')"}),
         " here")
    await self.view.dock(ScrollView(Panel(panel_text)), edge="top")

相关问题