11.3.3 模块实现

11.3.3 模块实现

使用tkinter进行GUI设计,界面可参考图11-9。

图11-9 主界面

1.登录设计

创建登录界面,在初始化方法中构建好登录界面,通过按钮实现页面跳转。登录界面如图11-10所示。

图11-10 登录界面

在登录模块,首先要创建窗口,在窗口中放置如图11-7所示的组件:3个标签、2个文本输入框、2个按钮。其中密码输入框中需要设置密码不可见,可通过将show属性设为“*”实现。两个按钮需要实现界面的跳转与链接交互,可通过设置command属性实现。

当用户输入账号和密码通过按钮提交请求时,需要将接收到的输入信息与文件中存储的用户信息进行匹配。设置一个方法专门从文件中获取用户账号信息,将获取到的信息存储到列表中。

再通过一个方法来判断输入内容与列表中的用户信息是否一致,一致则跳转页面并传递用户信息过去,不一致则弹出对话框。

2.主界面设计

(1)构造方法

在主界面设计中,将背单词系统设计成一个类,在类的构造方法中先将前一个窗口,即登录界面的窗口关闭,再创建主界面窗口。在构造方法中,设置各种初始化变量和方法调用。具体步骤如下。

a)关闭登录窗口,可用destroy()方法实现。

b)创建tkinter窗口对象作为主界面窗口,并设置窗口的相关属性,如大小、标题、背景等。

c)设置窗口中需要使用并能自动刷新的字符串变量tkinter.StringVar,如积分、用户名、显示的随机单词、回答提示信息等。

d)用字符串变量.set()方法设置字符串初始显示值。

e)设置各方法模块需要使用的属性,如单词列表变量、错词列表变量、计分、拼写填空变量等。设置为对象属性,则所有类中所有的方法均可访问。

f)创建单选按钮组号,用tkinter.IntVar()实现。

g)创建随机数,数值用来表示单词表的索引号,用于从单词表中随机抽取单词。

h)调用各种方法,如界面设置布局、窗体运行方法等。

(2)单词读取

从单词库文件中将单词读取出来。单词可以用文件存储,也可以用数据库存储。此处用的是文本文件。文件中一行为一个单词的中英文。

打开文件读取数据,先对数据进行清洗,按换行符将它们分离成列表,一个单词为一个元素。再对列表进行遍历,对于遍历到的每一个元素(即单词)再次进行分离,即每个单词分成中文和英文两个元素,将分离得到的列表追加到初始化设置中创建的单词列表变量中。

实现代码如下:

(3)主界面布局

主界面布局如图11-11所示。

参照主界面图进行界面元素的创建与布局。

a)标题:为标签,放置到顶部。

b)积分:用户名标签+积分标签,用户名标签中的文本属性为“用户名+当前积分”,积分标签中的内容为文本变量,显示为初始设置中的积分变量。

c)单词显示:标签,文本为初始设置中的显示单词变量。

图11-11 主界面布局

d)答案输入:输入文本框。

e)练习方式:单选按钮组,根据选择通过command属性调用不同的方法。

f)回答提示:标签,文本为初始设置中的提示变量。

g)判断(确定):按钮,通过command属性调用判断方法。

h)退出:按钮,通过command属性调用退出方法。

i)查看错词表:按钮,通过command属性调用错词显示方法。

j)查看单词表:按钮,通过command属性调用单词显示方法。

k)查看排行榜:按钮,通过command属性调用排行信息显示方法。

l)读音:按钮,背景图,通过command属性调用读音方法。

布局代码如下:

(4)单词练习方式模块

3个单选按钮对应不同的练习方式。根据选择不同的单选按钮,标签显示不同的内容。练习用户根据标签显示的内容在文本输入框中输入单词对应的中英文,单击“确定”按钮调用相应方法进行判断。方法的调用由各单选按钮的command属性触发,将command属性链接到对应的处理方法中。

单击英译中:标签显示英文,随机显示单词表中的一个单词,同时传递单词的英文给朗读变量。

单击中译英:随机显示单词表中的一个单词,标签显示中文,传递单词的英文给朗读变量。

单击拼写填空:单词字母随机缺少一个。利用随机数函数生成一个数字,遍历英文单词的字母,数字对应的位置替换为下划线,其他的字母正常显示,传递单词的英文给朗读变量。

(5)正误判断

先判断练习方式是哪一种,再获取文本框输入的内容,将获取内容与对应的单词表内容进行比对,相同,则增加积分,给出赞扬提示;不同,则给出鼓励提示,将对应单词加到错词表。

若为拼写填空模式,判断过程如下。

a)获取文本框输入内容(不区分大小写,则统一变成小写)。

b)如果输入内容与空缺内容相同,则给出赞扬提示,增加积分,并将积分变量进行更新,显示在标签中。

c)如果输入内容与空缺内容不同,则给出鼓励提示,将单词追加到错词列表。

d)再次生成随机数,用于下一轮的单词抽取。

e)调用拼写填空方法。

f)将文本输入框的内容清空。

若为中译英或英译中,判断过程如下。

a)如果为中译英模式,设c=1,即与文本框内容进行匹配的是列表中的索引号为1的元素,提取单词中的中文。

b)如果为中译英模式,设c=0,即与文本框内容进行匹配的是列表中的索引号为0的元素,提取单词中的英文。

c)将文本框内容与提取到的内容进行匹配。

d)如果相同,则给出赞扬提示,增加积分,更新积分显示。

e)如果不同,则给出鼓励提示,将单词追加到错词表。

f)再次生成随机数,用于下一轮单词抽取。

g)将抽取到的单词更新并显示出来。

h)清空文本框中的内容。

如果想在输入内容之后按键盘的回车键响应,即按回车键时调用judge()方法,可用如下代码实现:

(6)退出

单击退出按钮,退出程序,实现代码如下:

(7)单词读音

当单击界面上的读按钮时,能对界面上显示的单词进行语音朗读,具体操作如下。

①导入声音库,import win32com.client。

②传递单词的英文部分给Speak()方法,实现单词的朗读。

实现代码如下:

3.错词表

单击“查看错词表”按钮调用wrong_word)方法,则会打开新的窗口,进入错词表界面,原窗口隐藏。在新窗口将错词表中的内容以表格的形式列出来,并显示错误次数。

具体设计步骤如下。

①隐藏原窗口,创建新窗口。

②显示标题:标签。

③创建表格:表格位置、列数目3、列标题。

④遍历错词表,统计错词出现的次数:

a)对错词表进行排序,让相同的单词相邻;

b)在错词表末尾追加一个符号,用于遍历结束,便于统计次数;

c)获取错词中的第一个单词,并设出现次数为1;

d)从第二个单词开始对单词表进行遍历;

e)如果单词跟第一个单词相同,则将次数加1;

f)如果不同,则将单词的英文与中文、次数写入表格中显示,同时将次数修改为1,第一个单词的变量值改为当前单词;

g)将添加的符号删除,以防止下次对它进行统计。

⑤返回主界面:单击返回按钮,返回主界面,设置command事件为back()方法,即可返回主界面。

实现代码如下:

返回按钮的功能:关闭(销毁前一个),使用destroy()方法;同时更新、显示原隐藏主界面,使用update()和deiconify()来实现。

运行效果如图11-12所示。

图11-12 错词表

如果想要通过单击表格的标题对错词表进行排序,如单击标题错误次数,可以按次数降序或升序排序,如图11-13所示。

图11-13 错词表排序

需要先创建列表,对表格中获取的数据进行遍历,存放到创建的列表中,然后对列表进行排序,再对排序过后的列表进行索引移动,实现按所单击的标题进行排序并显示。实现代码如下:

4.单词表显示

在主界面单击“查看单词表”按钮,调用单词表显示方法,会打开新的窗口,并将原窗口隐藏。在新窗口将单词表中的内容以表格的形式列出来,并提供添加、删除、返回按钮,单击按钮调用相关方法。具体过程如下。

①隐藏原窗口,创建新窗口,用Toplevel()方法创建。

②显示标题:标签。

③创建表格:表格位置、列数目2、列标题。

④创建两个文本框,分别用于输入单词的中文和英文。

⑤创建4个按钮,分别对应添加、修改、删除、返回4个功能。

⑥遍历单词表,将单词的英文、中文显示在窗口的表格中。

⑦调用表格组件的左键单击响应事件,当单击表格中某个单词时,对应的中英文会显示在文本输入框中,可对其进行修改。

注意:使用tk.Tk()方法来新建窗口,这样得到的是一个新的根窗口,无法与原来的根窗口进行有效交互。

因此需要使用Toplevel组件新建顶级窗口,Toplevel组件是一个独立的顶级窗口,这种窗口通常拥有标题栏、边框等部件,和Tk()创建出来的根窗口是一样的,共享着一样的方法。

具体代码如下:

运行效果如图11-14所示。

5.单击事件

要实现用鼠标单击单词,被单击单词的中英文出现在界面的中英文输入框中,如图11-15所示,单击单词advise,在英文和中文的文本输入框中自动出现相应的英文和中文。

图11-14 单词表

图11-15 单击事件效果图

定义响应单击事件时,需要传递事件参数event。具体的操作如下。

a)获取列:使用identify_column(event.x)。

b)获取行:使用identify_row(event.y)。

c)将行或行中的元素信息获取到,可使用item(行\列,"values")方法,此处需要获取的是行中的信息。

d)将行中的第一个元素设为文本框中的英文部分并显示(以便单击修改、删除时传递数据)。

e)将行中的第二个元素显示为文本框中的中文部分。

实现代码如下:

接下来定义单击各按钮时响应的事件。

单击“添加单词”按钮实现以下操作:

①获取文本框中输入的单词中文和英文;

②将中英文组合成一个列表,即一个单词;

③判断这个单词是否已在单词表中,如果已存在,则给出提示信息;

④如果不存在,则将它追加到单词表中,显示在窗口表格的末尾。

具体代码如下:

单击“删除”按钮时,从单词列表及显示窗口将单词删除。具体操作如下。

①先弹出警告框,让用户选择是否确定删除单词。

②如果确定删除,将单词从单词表中删除,也从窗口表格中删除,同时弹出删除成功的提示窗口。

实现代码如下:

单击“修改”按钮时,可以对指定单词进行修改。具体操作如下。

①获取文本框中输入的英文和中文。

②弹出警告框,让用户选择是否确定修改单词。

③如果确定修改,则查看输入的英文和中文是否与原单词相同。

④如果相同,则弹出提示窗口。

⑤如果不同,但是输入的英文或中文为空,也弹出提示窗口。

⑥否则就将输入的单词替换为原单词表中的单词,并在窗口的表格中进行更新,给出修改成功的弹出窗口。

实现代码如下:

单击“保存”按钮时,将修改过的单词信息保存到单词文件中。具体操作如下。

①打开文件,以覆盖写的方式打开。

②遍历单词列表,逐行写入单词信息。

③关闭文件。

代码如下:

6.排行榜

在排行榜中,利用表格控件显示所有用户的积分,以及排名信息。

首先要获取排名文件中的排名信息。具体操作如下。

①创建列表,用来存储用户的积分信息。

②打开文件,将文件中的用户积分信息读取出来。需要对读取到的信息进行清理,去掉换行符,按逗号分离用户名和积分。

实现代码如下:

创建排行榜窗口,用列表控件显示排名信息。具体操作如下。

①隐藏主界面窗口,创建新窗口,设置窗口属性。

②设置标签,用来显示“排行榜”标题信息。

③设置表格控件,用3列来分别显示用户名、积分、排名,并将表格绑定单击事件,实现单击表头可进行按表标题排序。

④遍历用户积分列表,如果用户名在列表中存在,则用本次练习的积分替换原有积分。

⑤不存在,则将新用户的信息及积分添加到列表中。

⑥对列表按积分进行降序排序。

⑦遍历排序之后的列表,将信息显示在表格控件中。

实现代码如下:

运行效果如图11-16所示。

图11-16 排行榜