taipy 复制文本到剪切板

162 阅读1分钟

前言

同学想要一个提取验证码的工具,于是就用 taipy 帮他做了一个。 但有一个功能很难搞定,点击复制文本到剪切板。 查了很多资料都没有搞定。 一直都知道用 copy-to-clipboard 就能搞定。 而 taipy 必须通过插件才能执行 javascript 代码。

复制文本UI插件

taipy 的 UI 是基于 React 的。 所以我们通过 useEffect 订阅属性的变化,然后将收到的属性复制到剪切板就可以。

import { useEffect } from "react";

import { useDynamicProperty } from "taipy-gui";
import copy from "copy-to-clipboard";

interface CopyProps {
  text?: string;
}

export default function Copy({ text }: CopyProps) {
  // Dynamic string property
  const textProperty = useDynamicProperty(text, "", "");

  useEffect(function() {
    if (textProperty) {
      copy(textProperty);
    }
  }, [textProperty]);

  return <span />
}

我们通过 webpackCopy 组件进行编译,导出名为 Exts, 并生成文件 dist/library.js

taipy 插件

在上一步 Copy 的组件我们已经制作好了。 我们需要给 taipy 进行调用,需要声明为 taipy 插件,如下:

from taipy.gui.extension import ElementLibrary, Element, ElementProperty, PropertyType


class Exts(ElementLibrary):

    def get_name(self) -> str:
        return "exts"

    def get_elements(self) -> dict:
        return {
            "copy": Element(
                "text",
                {
                    "text": ElementProperty(PropertyType.dynamic_string)
                },
                react_component="Copy"
            )
        }

    def get_scripts(self) -> list[str]:
        return ["dist/library.js"]

我们告诉 taipy 插件的名字为 exts, 组件为 copy, 并指明编译后的 js 文件。

调用复制插件

通过传入 Gui 参数 libraries, 使得 taipy 知道我们的插件。 并在插件中调用 exts.copy 组件。

from taipy.gui import Gui
from exts import Exts

copy_text = ''

def do_copy(state):
    state.copy_text = 'This is the Copy text'

page = '''
<|复制|button|on_action=do_copy|>

<|{copy_text}|exts.copy|>
'''

Gui(page=page, libraries=[Exts()]).run(title="复制到剪切板")

将代码保存成 main.py 然后执行 python main.py。 打开页面后点击复制按钮,然后看看剪切板的内容。

后记

通过一个 Copy 的插件实现 taipy 复制文本到剪切板的功能。