Использование tag=value
в create_rectangle()
для идентификации элемента прямоугольника может иметь проблему, если несколько элементов в values
имеют одинаковое значение.
Я бы использовал список для сохранения элементов прямоугольника и обновления их высоты при сортировке на основе значения в той же позиции в values
:
import tkinter as tk
import random
width = 800
height = 800
thickness = 20
# generate values
values = [random.randrange(10, height) for i in range(width//thickness)]
print(values) # initial sequence
root = tk.Tk()
canvas = tk.Canvas(root, height=height, width=width, background='black')
canvas.pack()
# create the bars
cc = [] # hold the bar items (canvas rectangle item)
for i, value in enumerate(values):
x = i * thickness
item = canvas.create_rectangle(x, height, x+thickness, height-value, fill='white')
cc.append(item)
def swap_items(a, b):
values[a], values[b] = values[b], values[a]
# update the bar height at positons a and b
canvas.coords(cc[a], (a*thickness, height, (a+1)*thickness, height-values[a]))
canvas.coords(cc[b], (b*thickness, height, (b+1)*thickness, height-values[b]))
for i in range(len(values)):
for j in range(len(values)-i-1):
if values[j] > values[j+1]:
swap_items(j, j+1)
canvas.update()
canvas.after(50)
else:
canvas.after(5)
print(values) # sorted sequence
root.mainloop()