文章目录
开发汉字转拼音工具?先来一点小知识吧
如果你知道Vocaloid,肯定知道歌词文件里除了歌词本身,还塞满了各种歌曲配置参数。更头疼的是,中文歌词需要转换成拼音才能被合成引擎识别。这时候就需要一个能自动转换、还能智能分词和过滤配置信息的工具啦!
🤔 GUI的G是什么? Graphical(图形)还是Girlfriend(女朋友)?
GUI其实是:Graphical User Interface(图形用户界面)的缩写,简单说就是用窗口、按钮这些看得见摸得着的东西来代替黑乎乎的命令行。所以说:
- 你手机上的每个APP都是GUI
- 电脑上的文件夹窗口也是GUI
- 我们的拼音工具那些文本框和按钮更是GUI
虽然大家可能更需要Girlfriend User Interface(女朋友操作界面)
然而GUI的制作是一个极其浩大的工程,但是PyQt/PySide这俩兄弟恰好能让你用Python搞出花里胡哨的桌面程序。
⚙️为什么选择PySide6?
-
PySide6是Qt官方的Python绑定,相比PyQt:
-
许可证更宽松(LGPL)
-
与Qt官方更新同步
-
API与PyQt高度相似
🌰举个栗子:
from PySide6.QtWidgets import QApplication, QPushButton
# 创建魔法引擎 🧙
app = QApplication([])
# 召唤一个会说话的按钮 🎤
button = QPushButton("点我变强!")
button.clicked.connect(lambda: print("💪 你变强了!"))
# 启动次元之门 🌌
button.show()
app.exec()
-
from PySide6.QtWidgets import QApplication, QPushButton
- 这行代码从PySide6的QtWidgets模块中导入了两个类:
QApplication
和QPushButton
。QApplication
是管理应用程序的控件和主要设置的类,而QPushButton
是一个可以用于创建按钮的类。
- 这行代码从PySide6的QtWidgets模块中导入了两个类:
-
app = QApplication()
- 创建了一个
QApplication
对象。这个对象是应用程序的控制中心,管理应用程序的事件循环,处理用户输入,以及与其他操作系统进行交互。
- 创建了一个
-
button = QPushButton("点我变强!")
- 创建了一个
QPushButton
对象,并设置了按钮的文本为"点我变强!"。这个按钮将成为用户界面的一部分。
- 创建了一个
-
button.clicked.connect(lambda: print("你变强了!"))
- 这行代码将按钮的点击事件与一个lambda函数关联起来。lambda函数只是一个简单的匿名函数,当按钮被点击时,这个lambda函数会被调用,并打印出"你变强了!"。
-
button.show()
- 这行代码使按钮在屏幕上可见。之前创建的按钮对象已经存在,但其默认状态下是隐藏的,需要调用
show()
方法来显示它。
- 这行代码使按钮在屏幕上可见。之前创建的按钮对象已经存在,但其默认状态下是隐藏的,需要调用
-
app.exec()
- 这行代码启动了应用程序的事件循环。事件循环是GUI应用程序的核心机制,它负责等待事件的发生(如用户点击按钮),然后调用相应的处理函数。当调用
exec()
时,事件循环开始运行,应用程序进入等待状态,直到某些事件发生(如关闭窗口)。
当然把pyside6换成PyQt5,效果完全一样!
虽然它们本质上都是Qt
(一个超级厉害的C++界面库)的Python马甲,但在它们的帮助下,我们的工具既能处理原始歌词文件里的各种配置参数(比如[BPM=120]),又能把中文歌词精准地转换成拼音。
- 这行代码启动了应用程序的事件循环。事件循环是GUI应用程序的核心机制,它负责等待事件的发生(如用户点击按钮),然后调用相应的处理函数。当调用
(悄悄说:这个按钮虽然不能真的让你变强,但这个拼音转换工具能让你彻底摆脱手动标注拼音的苦力活,某种意义上也算是变强了呢!)
🔮正则表达式 or 格式化字符:你需要一把更强的名刀!
正则表达式就像一套精准的刀法,专门用来对付字符串中的各种妖魔鬼怪。相比之下,f-string 更像是瑞士军刀,适合日常简单操作但遇到复杂模式就力不从心。
基础的介绍还是要的
- 正则表达式(Regular Expression)
定位:精准匹配、复杂模式提取
作用:通过特定语法规则,搜索、匹配、替换字符串中的内容。
核心特点:
模糊匹配:处理非固定模式的文本(如提取所有邮箱、手机号)。
批量操作:一次性捕获或替换多处内容。
跨语言通用:绝大多数编程语言支持(Python、JavaScript、Java等)。- 格式化字符串(f-string)
定位:简单、直观的变量嵌入
作用:将变量、表达式直接嵌入字符串中,动态生成内容。
核心特点:
直接嵌入变量:无需拼接符,代码更简洁。
运行时计算:支持表达式(如 {a + b})。
Python 专属:仅限 Python 3.6+ 使用。
! Python 3.6-使用string.format()
🔍 正则基础招式
\d
居合斩:一刀斩获所有数字([0-9]
的快捷方式)[a-z]
燕返:精准击落所有小写字母(26个目标无一漏网)+
连击术:“再来一个!”(如同自助餐的"无限续杯")( )
捕获结界:标记重点目标(后续可用\1
召回)
⚔️ re vs f-string
import re
# 情景1:手机号打码(正则完胜)
phone = "13812345678"
# 正则版(名刀奥义)
safe_phone = re.sub(r'(\d{3})\d{4}(\d{4})', r'\1****\2', phone)
# f-string版(需要精确知道位置)
safe_phone_f = f"{phone[:3]}****{phone[-4:]}" # 硬编码切片位置
print(safe_phone) # 输出:138****5678
print(safe_phone_f) # 输出:138****5678
# 情景2:复杂文本提取(正则碾压)
text = "订单号:ABC123 金额:¥114514"
# 正则版(捕获组精准打击)
order_info = re.search(r'订单号:(\w+).*?金额:¥(\d+)', text)
print(f"订单:{order_info.group(1)}, 金额:{order_info.group(2)}") # 输出:订单:ABC123, 金额:114514
# f-string版(完全无法处理)
# 只能手动写N个find()和切片,代码会变成意大利面条🍝
🏆 正则的不可替代性
- 模糊匹配:当文本模式不确定时(如
"价格可能是¥114或¥514"
) - 批量捕获:一次性提取多处内容(
re.findall
比循环切片优雅10倍) - 动态模式:可以运行时构造正则表达式(f-string只能处理固定模板)
💡 何时用f-string?
- 字符串格式固定且简单时(如
f"你好,{name}"
) - 需要直接嵌入变量值时
- 可读性优先的场景
📜 总结:正则像妖刀村正——需要修炼但威力无穷;f-string像水果刀——随手可用但砍不动大树。高手往往两把刀都带在身上!## 第三课:pypinyin:汉字拼音翻译官
🥜 pypinyin:来点电子核桃?
这个库能把汉字变成拼音,就像给中文注音的小学语文老师👩🏫:
from pypinyin import lazy_pinyin
print(lazy_pinyin("哪吒")) # 输出:['ne', 'zha']
不过有时候它也会翻车:
print(lazy_pinyin("重庆")) # 输出可能是:['zhong', 'qing']
# 重庆人表示:我们读chong qing啊喂!
(所以其实光吃核桃是聪明不起来的!)
💻class:我好像可以有对象来着?
类(class)在python中是一种制造对象的模具。
🔧 造个"程序员"类:
class Programmer:
def __init__(self, name):
self.name = name
self.hair = "🌳 浓密" # 初始状态
def coding(self, hours):
self.hair = "🌱 稀疏" if hours > 8 else self.hair
print(f"{self.name}燃烧了{hours}小时生命...")
# 见证头发的奇迹 🪄
me = Programmer("小白程序员")
me.coding(10) # 🔥 输出:小白程序员燃烧了10小时生命...
print(me.hair) # 😭 输出:🌱 稀疏
📌 最后的小贴士
🛠️ 环境配置
pip install pypinyin PySide6 # 一键安装核心装备 🚀
💡 生存指南
-
正则调试:推荐使用regex101.com在线沙盒 🏖️
-
PySide6文档:Qt官方文档是你的圣典 📖
-
防秃指南:Ctrl+S是程序员最虔诚的祷告 🙏
🎯 终极秘籍:当代码报错时,记得保持微笑——至少你还有头发可以薅!💇♂️