在tkinter中的Bubblesort可视化

时间:2017-04-05 16:28:16

标签: python tkinter bubble-sort tkinter-canvas

我无法弄清楚如何完成一个用Python编写的简单程序。程序基本上生成十个随机数的数组,然后使用bubblesort算法对它们进行排序。整个短路过程应该显示在屏幕上 - 例如这个

enter image description here

我目前的代码是:

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)

但我无法弄清楚如何在屏幕上显示数字。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

要在画布上显示数字,您必须为每个数字创建一个文本项。看到我的代码的结尾。更难的部分是移动数字。一种方法是delete并重新创建;另一个是move。我选择了后者。

最困难的部分可能是时间延迟。如果使用mainloop,则应使用after而不是time.sleep(阻止循环)并且不使用for循环来制作动画。问题在于,自然包含for循环的函数(此处为sort)必须分解为其联合操作可能难以理解的部分。如果一个人只运行一个功能并且不关心用户交互(例如,暂停按钮),则可以使用time.sleepupdate。我这样做是为了让事情变得更加清晰。

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值和显示项组合为属性的项。他们只有一个组合项目数组。使用比较方法定义,可以将数组传递给任何排序函数。