Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Aug 17, 2024. It is now read-only.

Commit efaae61

Browse files
committed
se ha implementado POO
1 parent 16b6585 commit efaae61

File tree

5 files changed

+175
-127
lines changed

5 files changed

+175
-127
lines changed

‎classes/ArraySort.py‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import random
2+
3+
class ArraySort:
4+
def __init__(self):
5+
pass
6+
7+
def initArray(self, data, numBars):
8+
data = []
9+
for x in range(numBars):
10+
data.append(x+1)
11+
return data
12+
13+
def shuffleArray(self, data, numBars):
14+
for x in range(numBars):
15+
rng = random.randrange(0, numBars)
16+
data[x], data[rng] = data[rng], data[x]
17+
return data

‎classes/Configuracion.py‎

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from tkinter import *
2+
import tkinter as tk
3+
4+
class Configuracion:
5+
6+
def __init__(self, ventanaPrincipal):
7+
self.settings = Toplevel(ventanaPrincipal)
8+
self.settings.title("Opciones")
9+
self.settings.geometry("{}x{}+{}+{}".format(600, 350, 220, 200))
10+
self.settings.config(bg='white')
11+
12+
self.numBarsSlide=tk.StringVar()
13+
self.entryNumBars=tk.Scale(self.settings, from_=(2**1), to=(2**8), length=580, resolution=1, sliderlength=15, takefocus=34, orient=HORIZONTAL, label='Data size', variable=self.numBarsSlide)
14+
self.entryNumBars.grid(row=0, column=0, padx=5, pady=5)
15+
16+
self.mostrarTexto = tk.IntVar()
17+
self.btnMostrarTexto = Checkbutton(self.settings, text="Mostrar valor de las barras", variable = self.mostrarTexto, onvalue = 1, offvalue = 0,)
18+
self.btnMostrarTexto.grid(row=1, column=0, padx=10, pady=0, sticky=W)
19+
20+
self.btnAplicar = Button(self.settings, text='Aplicar', command=self.aplicarSettings)
21+
self.btnAplicar.grid(row=2, column=0, padx=10, pady=0, sticky=W)
22+
23+
"""Obtener la configuracion para mostrar el Array Sort
24+
25+
Return:
26+
[Tupla] - Datos obtenido para la configuracion de la animacion
27+
"""
28+
def obtenerConfiguracion(self):
29+
self.settings.wait_window()
30+
# [0]
31+
numBarsSlide = int(self.numBarsSlide.get())
32+
# [1]
33+
mostrarTexto = self.isChecked(self.mostrarTexto.get())
34+
return (numBarsSlide, mostrarTexto)
35+
36+
def isChecked(self, value):
37+
if (value == 1): return True
38+
elif (value == 0): return False
39+
40+
def aplicarSettings(self):
41+
self.settings.destroy()

‎main.py‎

Lines changed: 103 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -1,124 +1,114 @@
11
from tkinter import *
22
from tkinter import ttk
3-
import random
4-
from sorts.bubble.bubble import bubble_sort
5-
6-
root = Tk()
7-
root.title("Array sort visualizer")
8-
root.geometry("950x600")
9-
root.config(bg='black')
10-
11-
# variables
12-
selected_alg = StringVar()
13-
data = []
14-
MIN_BAR = 2
15-
MAX_BAR = 2**5
3+
import threading
164

17-
def initArrayData(maxBar):
18-
global data
19-
20-
data = []
21-
for x in range(maxBar):
22-
data.append(x+1)
5+
# Algoritmos de ordenacion / sorts
6+
from sorts.bubble.bubble import bubble_sort
237

24-
def drawData(data, colorArray):
25-
C_BODY_ANIMATION.delete('all')
8+
# Importar clases
9+
from classes.Configuracion import Configuracion
10+
from classes.ArraySort import ArraySort
11+
12+
class MainProgram:
13+
14+
# Array principal para las dimensines de las barras
15+
data = []
16+
17+
# Atributos para configuracion de la animacion
18+
numBars = 16
19+
mostrarTextoBarras = False
20+
21+
def __init__(self):
22+
self.root = Tk()
23+
self.root.title("Array sort visualizer")
24+
# self.root.geometry("950x600")
25+
self.root.geometry("{}x{}+{}+{}".format(950, 600, 200, 100))
26+
self.root.config(bg='black')
27+
self.root.resizable(0,0)
28+
self.agregar_menu()
29+
self.initGenerate()
30+
self.root.mainloop()
31+
32+
def agregar_menu(self):
33+
""" 1. Menu principal superior """
34+
C_MENU = Canvas(self.root, width=950, height=50, bg='#f0f0f0', highlightthickness=0)
35+
C_MENU.grid(row=0, column=0)
36+
C_MENU.grid_propagate(False)
37+
C_MENU.grid_rowconfigure(0, weight=1)
38+
C_MENU.grid_columnconfigure(0, weight=1)
39+
40+
# Frame para almacenar los botones de accion del programa
41+
F_MENU_BTNS = Frame(C_MENU, width=950, height=50, bg='#f0f0f0')
42+
F_MENU_BTNS.grid(row=0, column=0, sticky=W)
43+
44+
# Col[0] - Button Play
45+
self.photoPlay = PhotoImage(file = r"./img/play-button.png")
46+
self.btnStart = Button(F_MENU_BTNS, text='play', width=26, height=26, bg="#f0f0f0", border=0, activebackground="#ffffff", command=self.startAlgorithm, image=self.photoPlay)
47+
self.btnStart.grid(row=0, column=0, padx=10, pady=0)
48+
# Col[1] - Button restart
49+
self.photoRefresh = PhotoImage(file = r"./img/refresh.png")
50+
self.btnRestart = Button(F_MENU_BTNS, text='restart', width=26, height=26, bg="#f0f0f0", border=0, activebackground="#ffffff", command=self.generate, image=self.photoRefresh)
51+
self.btnRestart.grid(row=0, column=1, padx=10, pady=0)
52+
# Col[2] - Button settings
53+
self.photoSettings = PhotoImage(file = r"./img/settings.png")
54+
self.btnSettings = Button(F_MENU_BTNS, text='settings', width=26, height=26, bg="#f0f0f0", border=0, activebackground="#ffffff", command=self.openSettings, image=self.photoSettings)
55+
self.btnSettings.grid(row=0, column=2, padx=10, pady=0)
56+
57+
""" 2. Canvas para la representacion de las barras del array y animaciones """
58+
C_BODY = Canvas(self.root, width=950, height=550, bg='#ffffff', highlightthickness=0)
59+
C_BODY.grid(row=1, column=0)
60+
C_BODY.grid_propagate(False)
61+
62+
# Canvas que rodea el Canvas principal con la animacion del algoritmo Sort
63+
C_BODY_BORDER = Canvas(C_BODY, width=900, height=500, bg='#ffffff', bd=-2)
64+
C_BODY_BORDER.create_rectangle(0, 0, 900, 500, width=2)
65+
C_BODY_BORDER.grid(row=0, column=0, padx=20, pady=20)
66+
67+
# Canvas principal donde se representa el array y su animacion de ordenacion
68+
self.C_BODY_ANIMATION = Canvas(C_BODY, width=860, height=460, bg='#ffffff', bd=-2)
69+
self.C_BODY_ANIMATION.grid(row=0, column=0, padx=20, pady=20)
70+
71+
def drawData(self, data, colorArray):
72+
self.C_BODY_ANIMATION.delete('all')
2673
c_height = 460
2774
c_widtht = 860
2875
x_widtht = c_widtht / len(data)
2976
offset = 0
3077
spacing = 0
3178
normalizeData = [i / max(data) for i in data]
3279
for i, height in enumerate(normalizeData):
33-
# top left
34-
x0 = i * x_widtht + offset + spacing
35-
y0 = c_height - height * 440
36-
# bottom right
37-
x1 = (i + 1) * x_widtht + offset
38-
y1 = c_height
39-
C_BODY_ANIMATION.create_rectangle(x0, y0, x1, y1, fill=colorArray[i], outline="")
40-
C_BODY_ANIMATION.create_text(x0 + (x_widtht/2) - 6, y0, anchor=SW, text=str(data[i]))
41-
42-
root.update_idletasks()
43-
44-
45-
def Generate():
46-
global data
47-
global MAX_BAR
48-
49-
initArrayData(MAX_BAR)
50-
51-
for x in range(MAX_BAR):
52-
rng = random.randrange(0, MAX_BAR)
53-
data[x], data[rng] = data[rng], data[x]
54-
drawData(data, ['steelblue' for x in range(len(data))])
55-
56-
def StartAlgorithm():
57-
global data
58-
bubble_sort(data, drawData, 0.01)
59-
60-
def initGenerate():
61-
global data
62-
initArrayData(MAX_BAR)
63-
drawData(data, ['steelblue' for x in range(len(data))])
64-
65-
def openSettings():
66-
settingWindows = Toplevel()
67-
settingWindows.grab_set() # Mantiene el foco de la ventana hasta que se cierre y devuelve la interacción con la ventana principal, el root en este caso.
68-
settingWindows.focus_set() # Mantiene el foco cuando se abre la ventana.
69-
settingWindows.title("Opciones")
70-
settingWindows.geometry("600x400")
71-
settingWindows.config(bg='white')
72-
73-
sizeEntry = Scale(settingWindows, from_=3, to=25, resolution=1, orient=HORIZONTAL, label='Data size')
74-
sizeEntry.grid(row=1, column=0, padx=5, pady=5)
75-
76-
minEntry = Scale(settingWindows, from_=0, to=10, resolution=1, orient=HORIZONTAL, label='Min value')
77-
minEntry.grid(row=1, column=1, padx=5, pady=5)
78-
79-
maxEntry = Scale(settingWindows, from_=10, to=100, resolution=1, orient=HORIZONTAL, label='Max value')
80-
maxEntry.grid(row=1, column=2, padx=5, pady=5)
81-
82-
speedScale = Scale(settingWindows, from_=0.1, to=2.0, length=200, digits=2, resolution=0.1, orient=HORIZONTAL, label="Select Speed [s]")
83-
speedScale.grid(row=0, column=2, padx=5, pady=5)
84-
85-
"""Menu principal superior"""
86-
C_MENU = Canvas(root, width=950, height=50, bg='#f0f0f0', highlightthickness=0)
87-
C_MENU.grid(row=0, column=0)
88-
C_MENU.grid_propagate(False)
89-
C_MENU.grid_rowconfigure(0, weight=1)
90-
C_MENU.grid_columnconfigure(0, weight=1)
91-
92-
# Frame para almacenar los botones de accion del programa
93-
F_MENU_BTNS = Frame(C_MENU, width=950, height=50, bg='#f0f0f0')
94-
F_MENU_BTNS.grid(row=0, column=0, sticky=W)
95-
96-
# Col[0] - Button Play
97-
photoPlayButton = PhotoImage(file = r"./img/play-button.png")
98-
Button(F_MENU_BTNS, text='play', width=26, height=26, bg="#f0f0f0", border=0, activebackground="#ffffff", command=StartAlgorithm, image=photoPlayButton).grid(row=0, column=0, padx=5, pady=5)
99-
# Col[1] - Button restart
100-
photoRefresh = PhotoImage(file = r"./img/refresh.png")
101-
Button(F_MENU_BTNS, text='restart', width=26, height=26, bg="#f0f0f0", border=0, activebackground="#ffffff", command=Generate, image=photoRefresh).grid(row=0, column=1, padx=5, pady=5)
102-
# Col[2] - Button settings
103-
# photoSettings = PhotoImage(file = r"./img/settings.png")
104-
# Button(F_MENU_BTNS, text='settings', width=26, height=26, bg="#f0f0f0", border=0, activebackground="#ffffff", command=openSettings, image=photoSettings).grid(row=0, column=2, padx=5, pady=5)
105-
106-
"""Canvas para la representacion de las barras del array y animaciones"""
107-
C_BODY = Canvas(root, width=950, height=550, bg='#ffffff', highlightthickness=0)
108-
C_BODY.grid(row=1, column=0)
109-
C_BODY.grid_propagate(False)
110-
111-
# Canvas que rodea el Canvas principal con la animacion del algoritmo Sort
112-
C_BODY_BORDER = Canvas(C_BODY, width=900, height=500, bg='#ffffff', bd=-2)
113-
C_BODY_BORDER.create_rectangle(0, 0, 900, 500, width=2)
114-
C_BODY_BORDER.grid(row=0, column=0, padx=20, pady=20)
115-
116-
# Canvas principal donde se representa el array y su animacion de ordenacion
117-
C_BODY_ANIMATION = Canvas(C_BODY, width=860, height=460, bg='#ffffff', bd=-2)
118-
C_BODY_ANIMATION.grid(row=0, column=0, padx=20, pady=20)
119-
120-
# Iniciado de animaciones al iniciar el programa
121-
initGenerate()
122-
123-
# Main loop
124-
root.mainloop()
80+
# top left
81+
x0 = i * x_widtht + offset + spacing
82+
y0 = c_height - height * 440
83+
# bottom right
84+
x1 = (i + 1) * x_widtht + offset
85+
y1 = c_height
86+
self.C_BODY_ANIMATION.create_rectangle(x0, y0, x1, y1, fill=colorArray[i], outline="")
87+
# Texto sobre las barras
88+
if (self.mostrarTextoBarras):
89+
self.C_BODY_ANIMATION.create_text((x0 + 2), y0, anchor=SW, text=str(data[i]))
90+
self.root.update_idletasks()
91+
92+
def generate(self):
93+
self.data = arraySort.shuffleArray(self.data, self.numBars)
94+
self.drawData(self.data, ['#9370DB' for x in range(len(self.data))])
95+
96+
def startAlgorithm(self):
97+
bubble_sort(self.data, self.drawData, 0.01)
98+
99+
def initGenerate(self):
100+
self.data = arraySort.initArray(self.data, self.numBars)
101+
self.drawData(self.data, ['#9370DB' for x in range(len(self.data))])
102+
103+
def openSettings(self):
104+
settings=Configuracion(self.root)
105+
dataSettings=settings.obtenerConfiguracion()
106+
self.numBars = dataSettings[0]
107+
self.mostrarTextoBarras = dataSettings[1]
108+
self.initGenerate()
109+
110+
if __name__ == '__main__':
111+
# Instancia De la Clase ArraySort
112+
arraySort = ArraySort()
113+
# Main loop
114+
main=MainProgram()

‎sorts/bubble/bubble.py‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import time
22

33
def bubble_sort(data, drawData=None, timeTick=0):
4-
for _ in range(len(data)):
5-
for j in range(len(data) - 1):
6-
if data[j] > data[j+1]:
7-
data[j], data[j+1] = data[j+1], data[j]
8-
if drawData != None:
9-
drawData(data, ['limegreen' if x == j + 1 else "steelblue" for x in range(len(data))])
10-
time.sleep(timeTick)
11-
if drawData != None:
12-
drawData(data, ['limegreen' for x in range(len(data))])
13-
return data
4+
for _ in range(len(data)):
5+
for j in range(len(data) - 1):
6+
if data[j] > data[j+1]:
7+
data[j], data[j+1] = data[j+1], data[j]
8+
if drawData != None:
9+
drawData(data, ['#4682B4' if x == j + 1 else "#9370DB" for x in range(len(data))])
10+
time.sleep(timeTick)
11+
if drawData != None:
12+
drawData(data, ['#4682B4' for x in range(len(data))])
13+
return data

‎sorts/bubble/test_bubble.py‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from bubble import bubble_sort
33

44
class TestBubbleSort(unittest.TestCase):
5-
data = [2, 7, 0, 1, 9, 6, 8, 3, 4, 5]
5+
data = [2, 7, 0, 1, 9, 6, 8, 3, 4, 5]
66

7-
def test_1(self):
8-
array = bubble_sort(self.data)
9-
self.assertEqual(array, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
7+
def test_1(self):
8+
array = bubble_sort(self.data)
9+
self.assertEqual(array, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /