大约一年前,我参加了一门阿拉伯语课程。除了是一种从右到左书写的语言之外,阿拉伯语还有它自己的字母表。由于这是一个入门课程,我大部分时间都在学习阿拉伯语字母。
所以我决定创建一个学习辅助工具:它会呈现一个阿拉伯字母,我会进行猜测,然后它会告诉我我的答案是否正确。然而,一些简单的实验表明这种方法行不通——字母显得太小了,我无法确定我在命令行中看到的是什么。
我的下一个想法是想出一种窗口显示字形的方式,该字形要足够大,以便于识别。由于 PyQt 内置了这些功能,因此使用它似乎是最好的方法。
经过深入研究,我发现网上有很多资源,当我开始实验时,我需要确保所有代码都相关联。特别地,PyQt 从 PyQt 4 升级到 PyQt 5 时,组织结构发生了一些变化,后者需要 Python 3。
在整理好这一切之后,这就是我想出的
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
arabic.py
An exercise for learning Arabic letters. An Arabic letter is shown, the name of which can the guessed.
Hover the mouse cursor over the letter to see its name in a Tool Tip. Click Next to load another
letter.
"""
import sys
from random import randint
from PyQt5.QtCore import *
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QWidget, QLabel, QApplication, QToolTip, QPushButton
class Example(QWidget):
def __init__(self, parent = None):
super(Example, self).__init__(parent)
self.initUI()
def initUI(self):
QToolTip.setFont(QFont('DejaVuSans', 30))
i = randint(0, 37)
self.lbl2 = QLabel(L[12], self)
self.lbl2.setToolTip(lname[12]+' \n ')
self.lbl2.setFont(QFont('FreeSerif', 40))
self.lbl2.setTextFormat(1)
self.lbl2.setAlignment(Qt.AlignVCenter)
self.lbl2.setAlignment(Qt.AlignHCenter)
butn = QPushButton("Next", self)
butn.move(70, 70)
butn.clicked.connect(self.buttonClicked)
self.setGeometry(300, 300, 160, 110)
self.setWindowTitle('Arabic Letters')
self.show()
def buttonClicked(self):
i = randint(0,37)
self.lbl2.setFont(QFont('FreeSerif', 40))
self.lbl2.setTextFormat(1)
self.lbl2.setText(L[i])
self.lbl2.setAlignment(Qt.AlignVCenter)
self.lbl2.setAlignment(Qt.AlignHCenter)
self.lbl2.setToolTip(lname[i]+' \n ')
if __name__ == '__main__':
lname = ['alif','beh','teh','theh','jim','ha','kha','dal','dhal','ra','zin','sin','shin','Sad','Dad','Ta','DHa','ain','ghain','feh','qaf','kaf','lam','mim','nün','heh','waw','yeh', 'Sifr', 'wáaHid', 'ithnáyn', 'thaláatha','árba:ah', 'khámsah', 'sittah','sáb:ah', 'thamáanyah', 'tís:ah']
L = [u"\u0627", u"\u0628", u"\u062A", u"\u062B", u"\u062C",u"\u062D", u"\u062E", u"\u062F", u"\u0630", u"\u0631", u"\u0632", u"\u0633", u"\u0634", u"\u0635", u"\u0636", u"\u0637", u"\u0638", u"\u0639", u"\u063A", u"\u0641", u"\u0642", u"\u0643", u"\u0644", u"\u0645", u"\u0646", u"\u0647", u"\u0648", u"\u064A", u"\u0660", u"\u0661", u"\u0662", u"\u0663", u"\u0664", u"\u0665", u"\u0666", u"\u0667", u"\u0668", u"\u0669" ]
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
所有涉及 PyQt 5 的 import 语句都是经过多次试验和错误的结果,但它们涵盖了我需要的一切。我创建了一个 QWidget,它用作放置字母的空间,并包含一个标有“Next”的 QButton,用于继续下一个字形。在底部你可以看到我创建了两个列表:第一个,lname
,包含每个字母和阿拉伯数字的语音发音。第二个,L
,包含每个字形的 Unicode 值。
顶部是设置 QWidget 的函数。它选择要显示的字形,并在单击 Next 按钮时随机选择一个新的字形。当您将鼠标光标悬停在字形上时,发音会以工具提示的形式出现。您可能会注意到,第一个字形不是随机选择的;它是 L[12]
。 这是对这样一个事实的解决方法,即第一个字形决定了所有后续字形的最大显示空间,所以我选择了我可以找到的最宽的字形,以防止后续字形被截断。
这是小部件,没有显示和显示工具提示时的样子

我发现这个工具对学习阿拉伯字形很有帮助。只需更改 lname[]
和 L[]
的内容,即可轻松将其应用于其他主题。
8 条评论