要在畫布上顯示數字,您必須爲每個數字創建一個文本項目。查看我的代碼的結尾。更難的部分是移動數字。一種方法是delete
並重新創建;另一種是move
。我選擇後者。
最難的部分或許就是時間延遲。如果使用mainloop
,則應該使用after
而不是time.sleep
(這會阻止循環),並且不使用動態循環。問題在於,自然包含for循環的函數(這裏是sort
)必須分解成多個部分,其聯合操作可能很難理解。如果只運行一個功能並且不關心用戶交互(例如,暫停按鈕),則可以使用time.sleep
和update
。我這樣做是爲了讓事情更清楚。
from random import randrange
from time import sleep
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, bg='white', width='800', height='400')
canvas.pack()
ndigits = 10
digits = [randrange(10) for _ in range(ndigits)]
tdelta1, tdelta2 = .8, .2
xstart = 300
xdelta = 25
y = 80
def color(i, swap):
"Temporarily color digits i and i+i according to swap needed."
x = xstart + xdelta * i
dcolor = 'Red' if swap else 'green'
canvas.itemconfigure(items[i], fill=dcolor)
canvas.itemconfigure(items[i+1],fill=dcolor)
canvas.update()
sleep(tdelta1)
canvas.itemconfigure(items[i], fill='Black')
canvas.itemconfigure(items[i+1], fill='Black')
canvas.update()
sleep(tdelta2)
def swap(i):
digits[i], digits[i+1] = digits[i+1], digits[i]
canvas.move(items[i], xdelta, 0)
canvas.move(items[i+1], -xdelta, 0)
items[i], items[i+1] = items[i+1], items[i]
def bubsort():
"Sort digits and animate."
for stop in reversed(range(1, ndigits)):
# stop = index of position whose entry will be determined.
for i in range(stop):
swap_needed = digits[i] > digits[i+1]
color(i, swap_needed)
if swap_needed:
swap(i)
color(i, False)
# Create display items and pause.
items = [canvas.create_text(xstart + xdelta*i, y, text=str(digit))
for i, digit in enumerate(digits)]
canvas.update()
sleep(tdelta1)
bubsort()
該代碼使得它很容易取代文字數字顯示,例如,彩色條顯示。爲了進一步發展,我將定義一個組合int值和顯示項作爲屬性的項目類。他們將只有一個組合項目的數組。通過比較方法定義,數組可以傳遞給任何排序函數。
我不明白你爲什麼不看一個答案的工作代碼,也不是你的問題。你用'canvas.create_text'把數字放在畫布上。你的代碼的問題是,你並不是從顯示所有數字開始,在交換後不要顯示,也不要使用'x'來移動顯示位置。 'canvas.after調用缺少函數名稱,不應該在循環中。 –