【案例】tkinter动态演示——插入排序
发布日期:2021-06-30 15:03:18 浏览次数:2 分类:技术文章

本文共 3640 字,大约阅读时间需要 12 分钟。

案例介绍

我们将使用 python 的 tkinter 实现插入排序的动画演示,实现两个功能:1. 重置数据。2. 用户控制每一步的进行。

将要学习:1. 如何删除某个对象。2. 针对数字大小不同的情况,图表如何呈现?

准备工作

  • Python 3.x
  • 插入排序:插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。

界面模块

界面分为两个部分,首先是序列的显示部分,然后是两个交互按钮——单步执行、重置数据。

在这里插入图片描述

在这里插入图片描述
【key points】

  • 如何删除某个对象?

我们要在画布上绘制每个小矩形,画布初始化语句:

canvas = tk.Canvas(root, bg='white', height=400, width=1000)canvas.place(x=0, y=0)

每个矩形都有一个 tags 属性来标示每个矩形:

canvas.create_rectangle(x0, y0 - sortL[index][i] * 10, x0 + width, y0, width=3, fill='red', tags=str(i))

删除的时候,只需要删除对应 tags 的矩形即可:

canvas.delete(str(i))
  • 图表上如何体现每个数字?

如何使用不同的矩形高度表示不同的数字,首先,我们需要知道在 tkinter 中坐标系是如何构建的,在 tkinter 中,坐标原点处于左上角,向右为 x 轴正方向,向下为 y 轴正方向。 然后,我们需要知道如何在画布上绘制一个矩形,绘制矩形,需要传入两个坐标——矩形左上角点的 X,Y 坐标,还有矩形右下角点的 X,Y 坐标。

canvas.create_rectangle(x0, y0 - sortL[index][i] * 10, x0 + width, y0, width=3, tags=str(i))

其中,这两个坐标的横坐标很好理解,就是 x0 和 x0+矩形宽度。纵坐标和数字大小有关,我们设定最大数字为30,每大1,高度就增加 10 px,所以只需要使用 300-数字大小*10 即可得出 y 坐标,为了上方能够有空白,我们使用 350 作为被减数。

代码汇总

# coding: utf-8# !/usr/bin/python"""@File       :   动画演示插入排序.py@Author     :   jiaming@Modify Time:   2020/5/8 20:20@Contact    :   https://jiaming.blog.csdn.net/@WeChat 答疑 :   codenough@Desciption :   None"""import tkinter as tkimport randomimport copyimport tkinter.messageboxwidth = 30  # 矩形条宽度x0 = 80  # 矩形条x轴初始值y0 = 350  # 矩形条最高度index = 0  # 待排序数字的下标标记sortL = []  # 存储插入排序的每一步结果root = tk.Tk()root.title("动画演示插入排序")root.geometry('640x500+250+250')root.resizable(False, False)def insertSort():    """    生成随机数组, 并且保存插入排序的每步结果, 保存到sortL    :param num:    :return:    """    global sortL    # 随机生成数据列表    num = [i for i in range(1, 31, 1)]    random.shuffle(num)    num = num[:15]  # 取随机数组的前15个组成列表    sortL.append(copy.deepcopy(num))  # 存储每次排序结果    # 插入排序算法    for i in range(1, len(num)):        key = num[i]        j = i - 1        while j >= 0 and key < num[j]:            num[j + 1] = num[j]            j -= 1        num[j + 1] = key        sortL.append(copy.deepcopy(num))  # 存储每次排序结果    sortL.append(copy.deepcopy(num))def draw():    """    绘制结果    :return:    """    global width, x0, y0, index, sortL    x0 = 80  # x 坐标初始化    print(sortL[index])    def step():        # 删除每一个矩形以及字符        for i in range(15):            canvas.delete(str(i))            canvas.delete("string" + str(i))        draw()  # 重新绘制    stepBtn = tk.Button(root, text="单步排序", width=8, height=1, command=step)    stepBtn.place(x=200, y=420)    def reset():        global index        index = 0        sortL.clear()  # 清空结果列表        insertSort()  # 执行插入排序算法        draw()  # 绘制结果列表中的每一项    resetBtn = tk.Button(root, text="重置数据", width=8, height=1, command=reset)    resetBtn.place(x=350, y=420)    canvas = tk.Canvas(root, bg='white', height=400, width=1000)    canvas.place(x=0, y=0)    for i in range(15):        # 绘制矩形条        if index + 1 == i:  # 用红色标记待排序的数字            canvas.create_rectangle(x0, y0 - sortL[index][i] * 10,                                    x0 + width, y0, width=3, fill='red',                                    tags=str(i))        else:            canvas.create_rectangle(x0, y0 - sortL[index][i] * 10, x0 + width,                                    y0, width=3, tags=str(i))        # 绘制文本        canvas.create_text(x0 + width // 2, y0 - sortL[index][i] * 10 -                           width // 2, text=str(sortL[index][i]),                           font="time 10 bold underline",                           tags="string" + str(i))        x0 = x0 + width    if index == 14:        tk.messagebox.showinfo('信息', '排序完成')    index += 1if __name__ == "__main__":    insertSort()    draw()    root.mainloop()

运行截图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

后记

以上就是如何使用 tkinter 来演示插入排序的全部内容了,希望你们喜欢。

在这里插入图片描述

欢迎关注我的,里面有更多关于 python 的精彩知识分享哦~

转载地址:https://jiaming.blog.csdn.net/article/details/106007285 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:毕业设计日志(24)
下一篇:毕业设计日志(23)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月07日 18时22分47秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Ant内置任务之symlink 2019-05-01
Ant内置任务之sound 2019-05-01
Ant内置任务之typedef 2019-05-01
jface databinding:延迟计算--ComputedValue和WritableList使用的例子 2019-05-01
jface databinding:部分实现POJO对象的监测 2019-05-01
jface databinding:UpdateValueStrategy(数值更新策略)类详解 2019-05-01
jface databinding:构建一个改进版的通用型数值验证器StringToNumberValidator 2019-05-01
jface databinding:更简单的ISideEffect实现多目标单边数据绑定塈其原理分析 2019-05-01
jface databinding: Radio Button group及ISideEffect绑定数据对象的例子 2019-05-01
jface databinding: 创建readonly(只读)可观察对象(observable) 2019-05-01
jface databinding:输入无效数值时强制恢复初始值-updateModelToTarget 2019-05-01
java 8:只取年月日的java.util.Date(时分秒清零)对象 2019-05-01
javabean:boolean和Boolean类型的getter方法名是有区别的 2019-05-01
jface databinding:重写doSetValue方法ComputedValue实现双向多对一的数据绑定 2019-05-01
jface databinding:可多选的widget List组件selection项目与java.util.List对象的双向数据绑定 2019-05-01
jface databinding:使用CheckboxTableViewer实现表中(Set)对象与CheckTable中选中条目数据绑定 2019-05-01
jface databinding:List,Set,Map对象的Observable代理封装 2019-05-01
jface databinding:label provider 实现多列表格(Table)数据绑定的两个途径 2019-05-01
java:基于LinkedBlockingQueue实现的资源池 2019-05-01
msvc:BAT脚本判断是否设置MSVC编译的环境变量(执行vcvarsall.bat) 2019-05-01