使用 Python 和 PyQt 的学习辅助工具

这个图像识别工具可以适用于许多学科。
281 位读者喜欢这篇文章。

大约一年前,我参加了一门阿拉伯语课程。除了是一种从右到左书写的语言外,阿拉伯语还有自己的字母表。由于这是一个入门课程,我大部分时间都在学习阿拉伯语字母表。

所以我决定创建一个学习辅助工具:它会呈现一个阿拉伯字母,我会做出猜测,然后它会告诉我我是否回答正确。然而,一些简短的实验表明,这种方法行不通——字母显示得太小了,我无法确定我在命令行中看到的是什么。

我的下一个想法是想出某种窗口显示字形的方法,使其足够大以便于识别。由于 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]`。这是为了解决第一个字形决定了所有后续字形的最大显示空间这一事实而采取的变通方法,所以我选择了我可以找到的最宽的字形,以防止后续字形被截断。

这是小部件,不显示和显示工具提示

arabic letters.png

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

标签
Greg Pittman
Greg 是肯塔基州路易斯维尔的一位退休神经科医生,长期以来对计算机和编程感兴趣,从 1960 年代的 Fortran IV 开始。当 Linux 和开源软件出现时,它激发了他学习更多知识并最终做出贡献的承诺。他是 Scribus 团队的成员。

8 条评论

我还想到一个小小的改进。对于数字,可以添加我们熟悉的等价物。例如,“Sifr”是“零”。一些阿拉伯数字字形与我们的相似,但另一些则具有误导性。那么 lname 的最后十个元素可以是“Sifr (0)”、“wáaHid (1)”、“ithnáyn (2)”、“thaláatha (3)”、“árba:ah (4)”、“khámsah (5)”、“sittah (6)”、“sáb:ah (7)”、“thamáanyah (8)”、“tís:ah (9)”,这样在工具提示中您也可以看到标准数字。除了通过名称测试一个人对字形的知识外,您还可以测试含义。

非常酷的演示,感谢分享!

谢谢

如果不替换 lname 中非标准字母表字符,例如将 nün 替换为 nun,我就无法运行它。出现关于 non-utf-8 的错误

这个演示对我有效,只需在我的 Slackware 和 Fedora 系统上复制粘贴到文本编辑器即可。

您可能需要配置您的环境以支持 UTF8。检查 `locale` 命令的输出,看看您现在正在使用的字符编码是什么。

如果您需要更改它,有很多方法可以做到这一点,并且这篇 wiki 文章包含了您所有选项的精彩摘要。 https://wiki.archlinux.org.cn/index.php/locale#Setting_the_locale

回复 ,作者:Clint (未验证)

© . All rights reserved.