我无法弄清楚如何完成一个用Python编写的简单程序。程序基本上生成十个随机数的数组,然后使用bubblesort算法对它们进行排序。整个短路过程应该显示在屏幕上 - 例如这个
我目前的代码是:
import tkinter
import random
canvas = tkinter.Canvas(bg='white',width='800',height='400')
canvas.pack()
c = []
for i in range(0,10):
c=c+[random.randrange(10)]
print(c)
print('Zoradenie...', c)
def sort(c):
x=300
for i in range(0,10):
for j in range(0,len(c)-1-1):
if c[j+1]<c[j]:
c[j+1],c[j]=c[j],c[j+1]
canvas.create_text(300,80,text=c[j],fill='Red')
x+=25
canvas.update()
canvas.after(1000)
print(c)
return c
sort(c)
但我无法弄清楚如何在屏幕上显示数字。有什么想法吗?
答案 0 :(得分:1)
要在画布上显示数字,您必须为每个数字创建一个文本项。看到我的代码的结尾。更难的部分是移动数字。一种方法是delete
并重新创建;另一个是move
。我选择了后者。
最困难的部分可能是时间延迟。如果使用mainloop
,则应使用after
而不是time.sleep
(阻止循环)并且不使用for循环来制作动画。问题在于,自然包含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值和显示项组合为属性的项。他们只有一个组合项目数组。使用比较方法定义,可以将数组传递给任何排序函数。