캔버스에 숫자를 표시하려면 각 숫자에 대한 텍스트 항목을 만들어야합니다. 내 코드의 끝을 참조하십시오. 더 어려운 부분은 숫자 이동입니다. 한 가지 방법은 delete
이며 다시 작성하십시오. 다른 하나는 move
입니다. 나는 후자를 선택한다.
아마도 가장 힘든 부분은 시간 지연입니다. mainloop
을 사용하는 경우 time.sleep
(반복을 차단)이 아닌 after
을 사용해야하며 애니메이션의 for 루프는 사용하지 않아야합니다. 문제는 for-loops를 자연스럽게 포함하고있는 함수 (여기 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 값과 항목을 속성으로 결합하는 항목 클래스를 정의합니다. 그 (것)들은 결합한 품목의 단지 1 배열 일 것입니다. 비교 메서드를 정의하면 배열을 모든 정렬 함수에 전달할 수 있습니다.
답변을위한 작업 코드 나 질문을 보지 못한 이유를 모르겠습니다. 'canvas.create_text'를 사용하여 캔버스에 숫자를 입력합니다. 코드에 문제가있는 것은 모든 숫자를 표시하는 것으로 시작하지 않고 스와핑 한 후 양쪽 모두를 표시하지 않고 'x'를 사용하여 표시 위치를 이동하지 않는 것입니다. 'canvas.after 호출에 함수 이름이 없으므로 루프 안에 있으면 안됩니다. –