使用 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 的 import 语句都是经过多次试验和错误的结果,但它们涵盖了我需要的一切。我创建了一个 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 (未验证)

知识共享许可协议本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 授权。
© . All rights reserved.