Seite 1 von 1

veranschaung von "shakersort" mitels tkinter

Verfasst: Donnerstag 8. November 2007, 17:12
von Costi
ich wusste nicht das man das sich systematisch anpauken muss.
aber gut, in der schulle nehmen wie sortier algorithmen durch und jeder muss ueber einem einen referat halten.
ich hab das "shakesort"

und habe mit Tkinter ein kleines script geschrieben, welches die funktionsweise von shakersort veranschalulicht.
nicht gerade schoen, aber funzt gut:

feedback willkommen!

EDIT:
zwei unbenutzte varieblen entfernt

Code: Alles auswählen

from Tkinter import *
from time import sleep
import threading

class App(Frame):
	def __init__(self, *args, **kw):
		Frame.__init__(self, *args, **kw)
		
		self.btn_style = dict(bd=2, activeforeground='red')
		
		self.top = Frame(bg="black")
		self.top.grid(row=0, column=0, padx=10, pady=10)
		self.entries = []
		for i in range(10):
			e  = Entry(self.top, width=3, bg='#cccccc', justify="center", bd=0, font=("Times", 40, "bold"))
			self.entries.append(e)
			e.grid(row=0, column=i, pady=3, padx=5)
		
		
		self.bottom = Frame(self)
		self.bottom.grid(row=1, column=0, columnspan=10)
		
		self.btn = Button(self.bottom, command=self._start, text="go!", width=8, **self.btn_style)
		
		self.btn.grid(row=1, column=0)
		Button(self.bottom, text="best case", command=self._best_case, **self.btn_style).grid(row=1, column=1)
		Button(self.bottom, text="worst case", command=self._worst_case, **self.btn_style).grid(row=1, column=2)
		self.wait_time = IntVar(); Scale(self.bottom, from_=1, to=300, orient="horizontal", variable=self.wait_time, bd=0).grid(row=1, column=3)
			
	def _case(self, best):
		for c, entr in enumerate(self.entries):
			entr.delete(0, END); entr.insert(0, str(c if best else (10-c)))
	def _best_case(self): self._case(True)
	def _worst_case(self): self._case(False)
	
	def _start(self):
		print "start"
		self.btn.config(command=self._pause, text="pause")
		self.paused = False
		threading.Thread(target=self.mk_colored).start()
	
	def _continue(self):
		print 'continue'
		self.btn.config(command=self._pause, text="pause")
		self.paused = False
	
	def mk_colored(self):
		i = 0
		up = True
		while True:
			if up:
				if i >= len(self.entries)-1:
					up = False
					continue
				i += 1
			else:
				if i <= 1:
					up = True
					continue
				i -= 1
			
			
			entr0 = self.entries[i-1]
			entr1 = self.entries[i]			
			entr0.config(bg="red"); entr1.config(bg="red")
			wt = self.wait_time.get()/200.0
			
			while self.paused:
				sleep(0.15)
			
			sleep(wt); self._cmp_and_swap(self.entries[i-1], self.entries[i]); sleep(wt)
			entr0.config(bg="#cccccc"); entr1.config(bg="#cccccc")			
		
	def _cmp_and_swap(self, entr0, entr1):
		
		entr0_get = entr0.get()
		if entr0_get.isdigit(): entr0_get = int(entr0_get)
		entr1_get = entr1.get()
		if entr1_get.isdigit(): entr1_get = int(entr1_get)
		
		if entr0_get > entr1_get:
			entr0.delete(0, END); entr0.insert(0, entr1_get)
			entr1.delete(0, END); entr1.insert(0, entr0_get)

	def _pause(self):
		print 'pause'
		self.btn.config(command=self._continue, text="continue")
		self.paused = True


root = Tk()
App(root).grid()
root.mainloop()



Re: veranschaung von "shakersort" mitels tkinter

Verfasst: Donnerstag 8. November 2007, 18:43
von schlangenbeschwörer
Auf den ersten Blick recht nett. Die Beschriftung könntest du noch verbessern, und sollte der Algo automatisch stoppen, wenn er fertig ist mit sortieren. Am Code kann man wohl auch noch einiges machen.

Verfasst: Montag 17. Dezember 2007, 04:50
von nkoehring
schick veranschaulicht... aber das Programm stuerzt schwerst ab, wenn man es einfach beendet *und* wie schlangenbeschwörer schon sagte, solltest du den "Sortierer" abschalten, wenn er fertig ist.