Python tkinter中的动画仅在循环开始时起作用
我一直在尝试使用tkinter在python中实现气泡排序可视化,但它不起作用。当我只放了几个小节时,什么也没发生,但如果用很多小节来尝试,它们会移动,看起来就像它们应该移动一样(至少一开始是这样)。我的问题是,我的逻辑中是否有一个我看不到的错误,还是仅仅是tkinter?我开始考虑后者。提前谢谢。这是我的密码:Python tkinter中的动画仅在循环开始时起作用,python,animation,tkinter,visualization,bubble-sort,Python,Animation,Tkinter,Visualization,Bubble Sort,我一直在尝试使用tkinter在python中实现气泡排序可视化,但它不起作用。当我只放了几个小节时,什么也没发生,但如果用很多小节来尝试,它们会移动,看起来就像它们应该移动一样(至少一开始是这样)。我的问题是,我的逻辑中是否有一个我看不到的错误,还是仅仅是tkinter?我开始考虑后者。提前谢谢。这是我的密码: import tkinter import time import random width = 800 height = 800 canvas = tkinter.Canvas(h
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)
如果
value
中的多个项具有相同的值,则使用create_rectangle()
中的tag=value
来标识矩形项可能存在问题
我将使用列表来保存矩形项,并在排序过程中根据值中相同位置的值更新其高度:
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()
我建议将cc
作为矩形列表。然后你不需要移动矩形,只需要在交换值后根据其位置上的值更新它们的高度。首先你必须理解并感谢你,我已经研究过了,但是你能详细说明为什么它不起作用吗?我认为我使用after方法是正确的,他们在文档中提到它也可以用作简单的time.sleep方法,这就是我的意图。我也看不到一种简单的方法来实现使用函数移动矩形以使其更受事件驱动,这就是为什么我首先提出这个问题。如果您不理解这段代码为什么不起作用,那么您就无法理解使用tkinter进行事件驱动编程的原因。非常感谢!我不知道你可以那样使用canvas.coords。这非常有帮助,因为现在我知道tkinter毕竟是按预期工作的。