2017-04-05 53 views
1

我無法弄清楚如何完成一個用Python編寫的簡單程序。程序基本上生成十個隨機數組,然後使用bubblesort算法對它們進行排序。整個短路過程中應顯示在屏幕上 - 像這樣的一個tkinter中的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) 

但我無法弄清楚如何在屏幕上顯示的數字。有任何想法嗎?

+0

我不明白你爲什麼不看一個答案的工作代碼,也不是你的問題。你用'canvas.create_text'把數字放在畫布上。你的代碼的問題是,你並不是從顯示所有數字開始,在交換後不要顯示,也不要使用'x'來移動顯示位置。 'canvas.after調用缺少函數名稱,不應該在循環中。 –

回答

1

要在畫布上顯示數字,您必須爲每個數字創建一個文本項目。查看我的代碼的結尾。更難的部分是移動數字。一種方法是delete並重新創建;另一種是move。我選擇後者。

最難的部分或許就是時間延遲。如果使用mainloop,則應該使用after而不是time.sleep(這會阻止循環),並且不使用動態循環。問題在於,自然包含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值和顯示項作爲屬性的項目類。他們將只有一個組合項目的數組。通過比較方法定義,數組可以傳遞給任何排序函數。