大约一年前,我参加了一门阿拉伯语课程。除了是一种从右到左书写的语言外,阿拉伯语还有自己的字母表。由于这是一个入门课程,我大部分时间都在学习阿拉伯语字母表。
所以我决定创建一个学习辅助工具:它会呈现一个阿拉伯字母,我会做出猜测,然后它会告诉我我是否回答正确。然而,一些简短的实验表明,这种方法行不通——字母显示得太小了,我无法确定我在命令行中看到的是什么。
我的下一个想法是想出某种窗口显示字形的方法,使其足够大以便于识别。由于 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 的导入语句都是多次试验和错误的结果,但它们涵盖了我需要的一切。我创建了一个 QWidget,它充当放置字母的空间,并包含一个标记为“Next”的 QButton 以继续下一个字形。在底部您可以看到我创建了两个列表:第一个 `lname` 包含每个字母和阿拉伯数字的语音发音。第二个 `L` 包含每个字形的 Unicode 值。
顶部是设置 QWidget 的函数。它选择一个要显示的字形,并在您单击“Next”按钮时随机选择一个新的字形。当您将鼠标光标悬停在字形上时,发音会作为工具提示出现。您可能会注意到,第一个字形不是随机选择的;它是 `L[12]`。这是为了解决第一个字形决定了所有后续字形的最大显示空间这一事实而采取的变通方法,所以我选择了我可以找到的最宽的字形,以防止后续字形被截断。
这是小部件,不显示和显示工具提示

我发现这个工具对于学习阿拉伯语字形非常有用。通过简单地更改 `lname[]` 和 `L[]` 的内容,它可以很容易地适用于其他主题。
8 条评论