使用 Tkinter 在 Python 中创建 GUI 成绩单2025 年 3 月 17 日 | 阅读 43 分钟 Tkinter 是 Python 编程语言的标准图形用户界面 (GUI) 库。当与 Tkinter 库结合使用时,Python 提供了一种快速可靠的方式来构建基于 GUI 的应用程序。在本教程中,我们将借助 Python 中的 Tkinter 构建一个 GUI 成绩单。 根据牛津词典提供的定义,成绩单是学生学习的官方记录,代表所修课程和获得的成绩。简而言之,成绩单是表示学术工作所获分数的文档。 现在让我们在开始使用 Python 中的 Tkinter 库构建 GUI 成绩单之前,考虑项目的先决条件。 项目先决条件在 Python 中创建 GUI 成绩单时,我们需要一些库。这些库简要描述如下:
由于 Tkinter 库已预装在 Python 中,因此无需外部安装。但是,我们可以使用 PIP 安装程序安装 Pillow (PIL) 库,方法是在命令提示符或终端中键入以下命令。 语法 安装完成后,我们可以通过创建一个新的 python 程序文件并导入 pillow (PIL) 模块来验证 pillow 库是否安装正确。 以下是说明相同内容的代码片段。 文件:verify.py 现在,让我们保存文件并在命令提示符或终端中运行以下命令。 语法 如果程序没有返回任何导入错误,则说明库已成功安装。如果出现任何异常,请尝试重新安装库并考虑查看官方文档。 现在让我们开始构建项目。 使用 Python 中的 Tkinter 构建 GUI 成绩单我们已将使用 Python 创建 GUI 成绩单的完整项目代码分成几个步骤,以便更好地理解。这些步骤如下所示: 步骤 1: 导入必要的模块 步骤 2: 定义所需函数以操作用户数据并生成结果。 步骤 3: 创建应用程序的主窗口。 步骤 4: 向窗口添加必要的控件并设置事件触发器。 让我们更详细地了解上述步骤。 导入必要的模块我们将首先导入所有必要的模块来构建应用程序。这些模块包括 tkinter 模块以及 Tkinter 库的 messagebox 模块。我们还将包含 PIL 库中的必要模块。 以下是演示相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们从 tkinter 模块导入了所有模块和控件。我们还从 tkinter 模块导入了 messagebox 模块作为 mb。最后,我们从 PIL 模块导入了 ImageTk、Image、ImageDraw 和 ImageFont 模块。 定义应用程序函数成功导入所需模块后,现在是我们定义不同函数以允许我们操作用户输入数据的时候了。我们将定义函数来计算给定分数的总分、百分比和等级,并根据记录返回结果。我们还将添加其他函数来执行数据验证、显示结果、生成成绩单、清除所有条目和关闭应用程序。让我们详细了解这些函数的实现。 计算输入分数的总分的函数此函数将接受输入字段中的分数作为其参数,并计算分数的总和,返回总分。 让我们考虑以下说明相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们定义了一个函数 calculate_total()。此函数接受每个科目的分数作为其参数,并将它们全部相加,返回分数的总和。 计算计算总和百分比的函数此函数将接受从先前函数返回的总分,并通过将总分除以科目数量来计算平均值,返回计算出的百分比。 让我们考虑以下演示相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们定义了一个函数 calculate_percentage()。此函数接受包含总分的参数。在此函数中,我们通过将总分除以科目数量(在本例中为 5)来计算平均值,并返回计算出的百分比。 根据学生的百分比对学生进行评分的函数此函数将根据学生的表现和他们获得的百分比返回等级。我们将使用 if-elif-else 条件语句来计算等级。 让我们考虑以下说明相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们定义了一个函数 calculate_grade(),它接受 percentage 作为其参数。在此函数中,我们使用了 if-elif-else 条件语句,并根据学生的百分比返回等级。我们为百分比等于 95 或以上返回等级“O”。类似地,我们为百分比介于 90 到 94 之间返回等级“A+”,为 80 到 89 百分比返回等级“A”,为 70 到 79 百分比返回等级“B+”,为 60 到 69 百分比返回等级“B”,为 50 到 59 百分比返回等级“C”,为 33 到 49 百分比返回等级“D”,为低于 33 百分比返回等级“F”。 计算学生成绩的函数此函数将通过检查学生的百分比是否高于及格分数(在本例中为 33)来计算结果。我们还将检查学生是否通过了每个科目,并根据情况返回“PASS”或“FAIL”。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们定义了一个函数 calculate_result()。此函数接受多个参数,如 percentage 和所有科目的分数。在此函数中,我们使用 if-else 条件语句来检查百分比是否大于 33,以及每个科目的分数是否大于 33,并根据情况返回“PASS”或“FAIL”。 检查分数输入错误的函数此函数将检查是否有任何显示分数的字段为空,并返回一个显示错误的 messagebox。 让我们考虑以下说明相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们定义了一个函数 check_for_errors()。在此函数中,我们使用了 if 条件语句来检查是否有任何显示字段为空。然后我们显示了一个带有错误消息的 messagebox。我们还调用了函数来重置条目。最后,我们返回 -1 来退出进程。 显示结果的函数现在我们将定义一个函数来显示结果。此函数将检查科目名称字段及其分数。然后它将评估结果并将其显示给用户。 让我们考虑以下说明相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们定义了一个函数 display_result()。在此函数中,我们使用 get() 方法检索科目的详细信息。然后我们检查是否有任何字段为空,并返回一个显示相同错误的 messagebox。然后我们调用 check_for_errors() 函数来检查是否有任何分数字段为空。如果没有,我们将分数转换为浮点值。然后我们检查输入的范围是否从 0 到 100,并计算总分、百分比、等级和结果。如果结果等于“FAIL”,我们还将等级设置为“F”。然后我们调用一个函数来禁用所有字段,以便用户在计算结果后无法更改数据。然后我们使用 config() 方法和标签来显示结果。我们还将“生成成绩单”按钮的状态设置为正常。如果分数超出限制,我们返回一个显示错误的 messagebox 并调用 reset_subject_entries() 函数。 将成绩单生成为 PNG 文件的函数现在我们将定义一个函数,将成绩单生成为 PNG 文件。此函数将使用 PIL 库的一些模块并将输入数据添加到图像文件中。 以下是我们将在项目中使用的图像文件。 文件:report_card.png ![]() 让我们考虑以下说明相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们定义了一个函数 generate_marksheet()。在此函数中,我们使用 get() 方法从用户填写的输入字段中检索所有条目,并将它们存储为字符串。然后我们使用 cget() 方法从显示结果的标签中检索文本,并再次将它们存储为字符串。然后我们使用 Image 模块的 open() 方法从目录中导入图像文件,并使用 ImageDraw 模块的 Draw() 类创建一个 2D 图像界面,以将存储的值作为文本添加到图像中。然后我们定义了指定所有文本元素放置位置的不同坐标。然后我们使用 ImageFont 的 truetype() 方法并导入所需的字体来装饰文本值。然后我们使用 text() 方法和 Draw() 类的对象将存储的字符串值放置在图像文件中。最后,我们使用 save() 方法以学生的姓名保存图像文件,并使用 show() 方法显示最终图像。 禁用字段的函数此函数是可选的。我们将定义此函数以禁用输入字段,以便用户在计算结果后无法更改输入数据。 让我们考虑以下说明相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们定义了一个函数 disable_field()。在此函数中,我们对 Entry() 控件的对象使用了 config() 方法,并将其 state 参数的值设置为“disabled”。 启用字段的函数此函数也是可选的。我们将定义此函数以启用输入字段,以便用户在清除字段后可以输入数据。 让我们考虑以下说明相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们定义了一个函数 enable_field()。在此函数中,我们对 Entry() 控件的对象使用了 config() 方法,并将其 state 参数的值设置为“normal”。 重置“科目信息”部分条目的函数此函数将允许我们重置“科目信息”部分中的输入字段。 让我们考虑以下说明相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们定义了一个函数 reset_subject_entries()。在此函数中,我们调用了 enable_field() 函数。然后我们使用 delete() 方法删除“科目信息”部分中可用字段的条目。最后,我们使用 focus_set() 将焦点设置到第一个科目名称字段。 重置所有条目的函数现在我们将定义一个函数,允许我们重置用户填写的所有条目以及计算出的结果。 让我们考虑以下说明相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们定义了一个函数 reset()。在此函数中,我们调用了 reset_subject_entries() 函数。然后我们使用 delete() 方法删除剩余字段中的条目。然后我们使用 config() 方法配置显示结果的标签文本。我们还禁用了“生成成绩单”按钮,并使用 focus_set() 方法将焦点设置到第一个字段,即 name_field。 退出应用程序的函数现在我们将定义一个函数来退出应用程序。以下是说明相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们定义了一个函数 exit()。在此函数中,我们使用了 destroy() 方法来关闭应用程序。 创建应用程序的主窗口现在我们已经成功地定义了应用程序的所有必要函数,是时候创建应用程序的主窗口了,我们稍后将在其中添加不同的控件来操作用户数据和函数。 我们将使用 Tk() 类创建应用程序的主窗口。我们还将设置标题、大小、位置、背景颜色和图标。 让我们考虑以下说明相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们创建了一个 Tk() 类的对象,名为 gui_root。然后我们使用 title() 方法设置应用程序的标题。然后我们使用 geometry() 方法设置应用程序在屏幕上的大小和位置。然后我们通过将 resizable() 方法的参数设置为零来禁用可调整大小选项,以获得更好的 UI。我们通过将应用程序的背景颜色设置为 config() 方法中 bg 参数的值来将其配置为 #FCEEF6。然后我们使用 iconbitmap() 方法通过从目录导入 ICO 图像文件来设置应用程序的图标。 向主窗口添加控件并设置事件触发器由于应用程序的主窗口已成功创建,我们将向窗口添加所有必要的控件并设置事件触发器。这些控件包括用于构建其他控件的框架、用于显示重要信息的标签、用于插入数据的输入字段以及用于操作输入数据和调用函数的按钮。 现在让我们详细了解这些控件的添加。 添加框架 我们将首先向主窗口添加框架。这些框架将有助于构建其他控件。可以使用 tkinter 模块的 Frame() 控件创建这些框架。 让我们考虑以下演示相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们使用 Frame() 控件将框架添加到窗口中。我们还将这些控件的主参数分别设置为 gui_root 和 header_frame。我们通过将其设置为 bg 参数的值来配置背景颜色。最后,我们使用 pack() 方法设置这些框架的位置。 向 heading_frame 框架添加控件 现在我们将向此框架添加显示标题的标签和图像。我们将使用 Label() 控件添加标签。我们还将使用 PIL 库的 ImageTk 和 Image 模块从目录导入图像并使其兼容以在 Tkinter 应用程序中使用。 让我们考虑以下说明相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们使用了 ImageTk 模块的 PhotoImage() 方法。在此方法中,我们使用了 Image 模块的 open() 方法从目录中导入图像文件。我们还使用了 resize() 方法来调整导入图像的大小并将其转换为可在 Tkinter 应用程序中兼容使用的格式。然后我们使用 Label() 控件创建一些标签以显示导入的图像和标题。我们将这些标签的 master 参数设置为 heading_frame 框架。最后,我们使用 grid() 方法以网格格式设置这些标签的位置。 向 subheading_frame 框架添加控件 现在我们将向此框架添加一个标签以显示副标题。我们将再次使用 Label() 控件向应用程序添加标签。 以下代码片段说明了相同内容。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们使用了 Label() 控件添加标签以显示副标题。我们将此标签的 master 参数设置为 subheading_frame 框架。最后,我们使用了 pack() 方法设置此标签的位置。 向 info_frame 框架添加控件 现在我们将向此框架添加一些控件,以收集学生信息,包括学生的姓名、出生日期、班级、注册号、学校名称和学号。为了收集这些数据,我们将借助 Label() 控件使用标签来显示文本,要求用户输入详细信息。此外,我们将使用 Entry() 控件添加输入字段,供用户输入所请求的信息。 让我们在以下代码片段中了解其实现。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们使用 Label() 控件创建了一些标签,显示诸如学生信息、学生姓名、出生日期、班级、注册号、机构名称和学号等文本。我们将这些标签的 master 参数设置为 info_frame 框架。然后我们使用 grid() 方法以网格格式设置这些标签的位置。类似地,我们使用 Entry() 控件向应用程序添加了输入字段,并将其 master 参数设置为 info_frame 框架。然后我们借助 grid() 方法以网格格式设置这些框架的位置。 向 subject_frame 框架添加控件 现在我们将向此框架添加一些控件,以收集学生的学业记录,包括学生所学的科目和每个科目的分数。为了收集这些数据,我们将再次使用 Label() 控件来显示文本,要求用户输入与科目相关的详细信息。此外,我们将使用 Entry() 控件添加输入字段,供用户输入科目名称以及每个科目(满分 100 分)获得的成绩。 让我们在以下代码片段中了解其实现。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们使用了 Label() 控件创建了一些标签,显示诸如科目信息、科目名称、获得分数(满分 100 分)和科目数量等文本。我们将这些标签的 master 参数设置为 subject_frame 框架。然后我们使用 grid() 方法以网格格式设置这些标签的位置。类似地,我们使用 Entry() 控件向应用程序添加了输入字段,并将其 master 参数设置为 subject_frame 框架。然后我们借助 grid() 方法以网格格式设置这些框架的位置。 向 result_frame 框架添加控件 现在我们将向此框架添加一些标签,以显示输入分数的计算总分、百分比、等级和结果。我们将再次使用 Label() 控件为应用程序创建标签。 让我们考虑以下说明相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们使用了 Label() 控件创建了标签,显示计算的总分、百分比、等级和结果,以及一些相关文本。我们将这些标签的 master 参数设置为 result_frame 框架。最后,我们使用 grid() 方法以网格格式设置这些标签的位置。 向 buttons_frame 框架添加控件 现在我们将向此框架添加一些按钮,以操作输入数据并调用我们之前定义的函数。我们将使用 Button() 控件在应用程序中创建按钮。这些按钮包括计算结果、生成成绩单、重置条目和关闭应用程序的按钮。 让我们考虑以下演示相同内容的代码片段。 文件:guiMarksheet.py 说明 在上面的代码片段中,我们使用了 Button() 控件创建了按钮,以操作输入数据并调用我们之前定义的函数。我们将这些按钮的 master 参数设置为 buttons_frame 框架。我们还将每个按钮的 command 参数设置为它们将调用的函数。最后,我们使用 grid() 方法以网格格式设置这些按钮的位置。 运行应用程序 现在我们已经向应用程序添加了所有必要的控件,是时候调用 mainloop() 方法以及 Tk() 类的对象来运行应用程序了。 让我们考虑以下说明相同内容的代码片段。 文件:guiMarksheet.py 说明 我们在上面的代码片段中调用了 mainloop() 方法来运行应用程序。 因此,项目代码现在已完成。我们将保存此 python 程序文件并在命令提示符或终端中运行以下命令以查看输出。 语法 但在我们看到输出之前,“使用 Tkinter 的成绩单”的完整项目代码如下所示。 完整的项目代码以下是“使用 Python 中的 Tkinter 的成绩单”的项目代码。 文件:guiMarksheet.py 输出 图像 1:成绩单生成器 - 应用程序 ![]() 图像 2:文件:John Miller.png - 成绩报告单 ![]() |
我们请求您订阅我们的新闻通讯以获取最新更新。