veranschaung von "shakersort" mitels tkinter

Code-Stücke können hier veröffentlicht werden.
Antworten
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

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


cp != mv
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

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.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten