这段代码实现了一个使用 tkinter 绘制动画演示插入排序的小程序。程序随机生成一个包含 1 到 30 的数字列表,然后展示每一步插入排序的过程。
主要步骤如下:
insertSort()
函数:生成一个随机数组并保存插入排序的每一步结果到sortL
列表中。每一步排序后的结果都被保存。draw()
函数:根据sortL
列表的内容,绘制排序的过程。通过canvas
组件在窗口中绘制矩形条和相应的数字。- 创建主窗口
root
,设置标题、大小、位置、不可调整大小等属性。 - 创建 “单步排序” 按钮
stepBtn
和 “重置数据” 按钮resetBtn
,分别对应单步演示和重置数据操作。 - 创建
canvas
组件用于绘制矩形条和数字,设置背景颜色、高度、宽度等属性。 - 在循环中根据排序过程,绘制矩形条和相应的数字。在绘制的过程中,如果当前索引等于正在排序的数字的索引,则使用红色标记。
- 通过点击 “单步排序” 按钮,可以逐步演示排序过程。
- “重置数据” 按钮可以重新生成随机数据并重置排序过程。
- 程序在运行后会自动调用
insertSort()
生成随机数据并调用draw()
绘制排序过程。 - 最后通过
root.mainloop()
进入主循环,等待用户交互。
请注意,这个程序在 tkinter 窗口中展示了插入排序的排序过程,可以点击 “单步排序” 按钮以步骤方式演示排序,点击 “重置数据” 按钮可以重新生成随机数据并重置排序过程。
# coding: utf-8
import tkinter as tk
import random
import copy
import tkinter.messagebox
width = 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 += 1
if __name__ == "__main__":
insertSort()
draw()
root.mainloop()
评论前必须登录!
注册