2017-04-05 2 views
1

Ich kann nicht herausfinden, wie ich ein einfaches in Python geschriebenes Programm beenden kann. Das Programm erzeugt grundsätzlich ein Array von zehn Zufallszahlen und sortiert sie dann mit dem Bubblesort-Algorithmus. Whole Verkürzungsprozess auf dem Bildschirm angezeigt werden soll - wie dieserBubblesort Visualisierung in Tkinter

enter image description here

Mein aktuellen Code ist dies:

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) 

Aber ich kann nicht herausfinden, wie Zahlen zu zeigen, auf dem Bildschirm. Irgendwelche Ideen?

+0

Ich verstehe nicht, warum Sie nicht auf den Arbeitscode für eine Antwort schauen, noch Ihre Frage. Sie setzen Zahlen mit 'canvas.create_text' auf die Leinwand. Das Problem mit Ihrem Code ist, dass Sie nicht alle Zahlen anzeigen, nicht beide nach dem Tauschen anzeigen und nicht 'x' verwenden, um die Anzeigeposition zu verschieben. Der 'canvas.after-Aufruf 'fehlt der Funktionsname und sollte nicht in der Schleife sein. –

Antwort

1

Um die Ziffern auf der Zeichenfläche anzuzeigen, müssen Sie für jede Ziffer ein Textelement erstellen. Siehe das Ende meines Codes. Der schwierigere Teil bewegt die Ziffern. Ein Weg ist delete und neu erstellen; der andere ist move. Ich wähle das letztere.

Der schwierigste Teil ist vielleicht die Zeitverzögerungen. Wenn man mainloop verwendet, sollte man after anstelle von time.sleep verwenden (was die Schleife blockiert) und keine for-Schleifen für die Animation verwenden. Das Problem ist, dass die Funktion (hier sort), die natürlich For-Schleifen enthält, in Teile zerlegt werden muss, deren gemeinsame Operation schwer zu verstehen ist. Wenn nur eine Funktion ausgeführt wird und Benutzerinteraktion nicht wichtig ist (z. B. eine Pause-Schaltfläche), kann time.sleep und update verwendet werden. Ich habe es hier getan, um das, was vor sich geht, klarer zu machen.

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()

Dieser Code es ziemlich einfach macht den Text stelliges Display mit, zum Beispiel, eine farbige Balkenanzeige zu ersetzen. Um dies weiter zu entwickeln, würde ich eine Klasse von Elementen definieren, die int-Werte kombinieren und Elemente als Attribute anzeigen. Dort wären sie nur ein Array von kombinierten Items. Wenn Vergleichsmethoden definiert sind, könnte das Array an irgendeine Sortierfunktion übergeben werden.