Анимация в tkinter работает только в начале цикла - PullRequest
0 голосов
/ 31 марта 2020

Я пытался сделать визуализацию пузырьковой сортировки в python, используя tkinter, но она не работает. Когда я вставляю только несколько баров, ничего не происходит, но если попробовать это с большим количеством баров, они двигаются, казалось бы, как и должно быть (сначала, по крайней мере). У меня вопрос, есть ли ошибка в моей логи c, которую я не вижу, или это просто tkinter? Я начинаю думать о последнем. Заранее спасибо. Вот мой код:

import tkinter
import time
import random

width = 800
height = 800
canvas = tkinter.Canvas(height=height, width=width, background='black')
canvas.pack()

thickness = 20

values = [random.randrange(height) for i in range(width//thickness)]

cc = {}

for value in values:
    cc[value] = 0

print(values)

x1 = 0
for value in values:
    canvas.create_rectangle(x1,800, x1+thickness,value, fill='white', tag=value)
    cc[value] = x1
    x1 += thickness

for i in range(len(values)):
    for j in range(len(values)-i-1):
        if values[j] > values[j+1]:
            values[j], values[j+1] = values[j+1], values[j]
            canvas.move(values[j], cc[values[j+1]] - cc[values[j]], 0)
            canvas.move(values[j+1], cc[values[j]]- cc[values[j+1]], 0)
            cc[values[j]] += (cc[values[j+1]]- cc[values[j]])
            cc[values[j+1]] += (cc[values[j]]- cc[values[j+1]])
            canvas.update()
            canvas.after(50)
            canvas.update()
        else:
            canvas.after(5)

canvas.mainloop()

print(values)

1 Ответ

0 голосов
/ 02 апреля 2020

Использование 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...