吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3823|回复: 40
收起左侧

[Python 原创] 自用的词语转拼音,有需要的自取

[复制链接]
liuchangng 发表于 2023-4-28 10:01
本帖最后由 liuchangng 于 2024-4-19 16:01 编辑

使用python写的图形汉语词语转拼音小工具

1)安装库
[Shell] 纯文本查看 复制代码
pip install flet


2)代码
[Python] 纯文本查看 复制代码
# 声母列表
initial_consonant_list = ['b', 'p', 'm', 'f', 'd', 't', 'n', 'l', 'g', 'k', 'h', 'j', 'q', 'x', 'zh', 'ch', 'sh', 'r',
                          'z', 'c', 's', 'y', 'w']
# 韵母列表
list_of_vowels = ['a', 'o', 'e', 'i', 'u', 'ü', 'ai', 'ei', 'ui', 'ao', 'ou', 'iu', 'ie', 'üe', 'er', 'an', 'en', 'in',
                  'un', 'ün', 'ang', 'eng', 'ing', 'ong']


class Chinese2PinYin(UserControl):

    # 构造方法
    def __init__(self, page: Page):
        super().__init__()
        self.page = page
        self.content = TextField(label='词语之间用空格分割!', multiline=True)
        # 模板路径
        self.template_path = None
        # 生成word路径
        self.word_doc_path = None
        # 创建一个DataTable
        self.table = DataTable(
            border=flet.border.all(0.8, "black"),
            bgcolor=flet.colors.GREY_50,
            border_radius=10,
            vertical_lines=flet.border.BorderSide(1, "black"),
            horizontal_lines=flet.border.BorderSide(1, "black"),
            visible=False,
            columns=[
                DataColumn(Text("词语")),
                DataColumn(Text("本地")),
                DataColumn(Text("百度")),
            ]
        )
        # 保存拼音不同的记录
        self.table_rows = []
        # 选择模板
        self.file_template = flet.FilePicker(on_result=self.pick_file_result)
        # 注音按钮
        self.zhuyin_btn = ElevatedButton('注音', disabled=True, icon=flet.icons.SAVE, on_click=self.generate_pinyin)

    def build(self):
        self.page.overlay.append(self.file_template)
        return Column(controls=[
            Row(
                controls=[
                    Text('声母: ', size=20),
                    Text('\t'.join(initial_consonant_list), size=18)
                ]
            ),
            Column(
                controls=[
                    Text('韵母(24个): ', size=20),
                    Row(
                        controls=[
                            Text('单韵母(6个): ', size=18),
                            Text('\t'.join(list_of_vowels[0:6]), size=18)
                        ]
                    ),
                    Row(
                        controls=[
                            Text('复韵母(8个): ', size=18),
                            Text('\t'.join(list_of_vowels[6:14]), size=18)
                        ]
                    ),
                    Row(
                        controls=[
                            Text('特殊元音韵母(1个): ', size=18),
                            Text(list_of_vowels[14], size=18)
                        ]
                    ),
                    Row(
                        controls=[
                            Text('前鼻韵母(5个): ', size=18),
                            Text('\t'.join(list_of_vowels[15:20]), size=18)
                        ]
                    ),
                    Row(
                        controls=[
                            Text('后鼻韵母(4个): ', size=18),
                            Text('\t'.join(list_of_vowels[20:]), size=18)
                        ]
                    ),
                ]
            ),
            # 分割器
            flet.Divider(height=3, color=flet.colors.BROWN_50),
            Text(value='请输入要注音的汉字: ', size=20),
            self.content,
            Row(
                controls=[
                    ElevatedButton('选择模板...', icon=flet.icons.UPLOAD_FILE, on_click=self.select_template),
                    self.zhuyin_btn
                ],
                alignment=flet.MainAxisAlignment.END
            ),
            self.table,
        ])

    def pick_file_result(self, e: flet.FilePickerResultEvent):
        if e.files:
            for file in e.files:
                self.template_path = file.path
                print(f'名称:{file.name}, 大小: {file.size}')
        self.zhuyin_btn.disabled = False
        self.update()

    def select_template(self, e):
        self.file_template.pick_files(dialog_title='选择拼音模板', initial_directory='.', allowed_extensions=['doc', 'docx'])

    def generate_pinyin(self, e):
        """
        点击"拼音"按钮事件
        :param e:
        :return:
        """
        txt = self.content.value
        # 输出所有的词语
        print(txt)
        self.word_2_pinyin(txt)
        # 表格赋值
        self.table.visible = True
        self.table.rows.extend(self.table_rows)
        self.update()

        def close_dlg(e):
            dialog.open = False
            os.startfile(pathlib.Path.home())  # windows平台打开指定的目录
            self.page.update()

        # 弹框提示word生成路径
        dialog = AlertDialog(
            title=Text('生成文档路径'),
            actions=[
                TextButton("确定", on_click=close_dlg)
            ],
            actions_alignment=flet.MainAxisAlignment.END,
        )
        self.page.dialog = dialog
        dialog.content = Text(self.word_doc_path)
        dialog.open = True
        self.page.update()

    def word_2_pinyin(self, ciyu):
        """
        词组或汉字转拼音
        """
        # 读取模板
        doc = DocxTemplate(self.template_path)
        # 保存汉字和拼音列表结果
        py_hz = []
        all_words = [item for item in ciyu.strip().replace('\n', ' ').split(" ") if item]  # 去掉换行符,并用空格分割
        line_word_num = 7  # 每行词组个数
        for j in range(1, math.ceil(len(all_words) / line_word_num) + 1):
            word_5 = all_words[line_word_num * (j - 1):line_word_num * j]
            row_1 = {}
            for i in range(len(word_5)):
                py = lazy_pinyin(word_5[i], style='Style.TONE')
                baidu_pinyin = chinese_2_pinyin(word_5[i], 'BAIDU', True)
                if baidu_pinyin and baidu_pinyin == ' '.join(py):
                    pass
                else:
                    self.table_rows.append(DataRow(
                        cells=[
                            DataCell(Text(word_5[i])),
                            DataCell(Text(' '.join(py), selectable=True)),
                            DataCell(Text(baidu_pinyin, selectable=True)),
                        ]))
                if pinyin_start_valid(py[0]):
                    row_1[f'p{i + 1}1'] = py[0][0:2]
                    row_1[f'p{i + 1}2'] = py[0][2:]
                else:
                    row_1[f'p{i + 1}1'] = py[0][0]
                    row_1[f'p{i + 1}2'] = py[0][1:]

                if pinyin_start_valid(py[1]):
                    row_1[f'p{i + 1}3'] = py[1][0:2]
                    row_1[f'p{i + 1}4'] = py[1][2:]
                else:
                    row_1[f'p{i + 1}3'] = py[1][0]
                    row_1[f'p{i + 1}4'] = py[1][1:]
                max_len = max([len(i) for i in py])
                if max_len > 3:
                    row_1[f'h{i + 1}'] = '  '.join(list(word_5[i]))
                elif max_len > 2:
                    row_1[f'h{i + 1}'] = ' '.join(list(word_5[i]))
            py_hz.append(row_1)
        # 需要传入的字典, 需要在word对应的位置输入 {{ first_py }}
        context = {"items": py_hz}
        doc.render(context)  # 渲染到模板中
        # 生成文档
        self.word_doc_path = f"{pathlib.Path.home()}{os.sep}拼音在汉字上面(表格).docx"
        doc.save(self.word_doc_path)


def pinyin_start_valid(pinyin):
    """判断拼音是否以zh,ch,sh开头"""
    return pinyin.startswith('zh') or pinyin.startswith('ch') or pinyin.startswith('sh')


def main(page: Page):
    # 标题
    page.title = '生成汉字拼音工具v1.0'
    page.window_width = 800
    page.window_height = 700
    # 居中
    page.window_center()

    app = Chinese2PinYin(page)

    page.add(app)


if __name__ == '__main__':
    flet.app(target=main, assets_dir='assets')



3)测试版本,有问题及时留言
链接:https://pan.baidu.com/s/1XJWAkMZm_6kSBJ3j-YwLjA?pwd=1024 提取码:1024目前已经支持 2个汉字,3个汉字,4个汉字的拼音

4)展示效果
4.png
5.png
2.png
3.png
1.png

免费评分

参与人数 6吾爱币 +11 热心值 +6 收起 理由
Circulation2020 + 1 谢谢@Thanks!
fgboy + 1 + 1 哥,链接失效了。。
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
aqdy2021 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
德德哥 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yuweb + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

晚临风 发表于 2023-11-6 08:53
本帖最后由 晚临风 于 2023-11-6 09:07 编辑
wdklwky 发表于 2023-11-5 22:58
您好,您是不是下载到了这个汉语词语转拼音小工具?能不能分享一下,谢谢啦!

链接:https://pan.baidu.com/s/16Lf8T-Dw33T_KO0l-Ydfew?pwd=z4l3
提取码:z4l3
密码详见rar文件注释

擦,忘了设置成了加密文件名了,密码如下:
123456

或者你也可以使用这个:
https://www.52pojie.cn/forum.php?mod=viewthread&tid=1745012&highlight=%CE%C4%D7%D6%D7%AA%C6%B4%D2%F4
风子是我 发表于 2024-3-15 16:08
Traceback (most recent call last):
  File "C:/Users/weleg/Desktop/333.py", line 9, in <module>
    class Chinese2PinYin(UserControl):
NameError: name 'UserControl' is not defined
gulang20230313 发表于 2023-4-28 11:07
虽然看不懂,感觉很厉害的样子,谢谢大佬分享
andyfky 发表于 2023-4-28 11:20
对于有小孩的家庭挺实用的。感谢。
yms 发表于 2023-4-28 11:24
已收藏,谢谢分享!
jwzb 发表于 2023-4-28 13:10
有打包好的成品吗
aqdy2021 发表于 2023-4-28 13:42
有小孩家长的辅导福音,同求大佬成品
 楼主| liuchangng 发表于 2023-4-28 15:14
aqdy2021 发表于 2023-4-28 13:42
有小孩家长的辅导福音,同求大佬成品

有的, 链接: https://pan.baidu.com/s/1SHwX5ma-q26nuY7Wm0paqA?pwd=983p 提取码: 983p 复制这段内容后打开百度网盘手机App,操作更方便哦
目前已经支持 2个汉字,3个汉字,4个汉字的拼音
 楼主| liuchangng 发表于 2023-4-28 15:15
aqdy2021 发表于 2023-4-28 13:42
有小孩家长的辅导福音,同求大佬成品

链接: https://pan.baidu.com/s/1SHwX5ma-q26nuY7Wm0paqA?pwd=983p 提取码: 983p 复制这段内容后打开百度网盘手机App,操作更方便哦
目前已经支持 2个汉字,3个汉字,4个汉字的拼音
aqdy2021 发表于 2023-5-4 07:17
liuchangng 发表于 2023-4-28 15:15
链接: https://pan.baidu.com/s/1SHwX5ma-q26nuY7Wm0paqA?pwd=983p 提取码: 983p 复制这段内容后打开百 ...

太好啦,感谢老师分享!
eveffort 发表于 2023-5-5 14:43
对于有小孩的家庭挺实用的。感谢分享。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 12:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表