1
+ from tkinter import *
2
+ from tkinter import ttk
3
+ from PIL import ImageTk ,Image
4
+ from colors import *
5
+ import random
6
+
7
+ # Importing algorithms
8
+ from bubblesort_code import bubble_sort
9
+ from insertionsort_code import insertion_sort
10
+ from selectionsort_code import selection_sort
11
+ from mergesort_code import merge_sort
12
+ from quicksort_code import quick_sort
13
+
14
+ # Main window
15
+ window = Tk ()
16
+ window .state ("zoomed" )
17
+ window .title ("DSA Project" )
18
+ window .geometry ("750x600" )
19
+ #bg image
20
+ bg_org = Image .open ('bg.webp' )
21
+ bg = ImageTk .PhotoImage (bg_org )
22
+ bglabel = Label (window ,image = bg )
23
+ bglabel .place (x = 0 ,y = 0 )
24
+
25
+ #global
26
+ s = 'Sorting Algorithm Visualiser'
27
+ text = ''
28
+ count = 0
29
+ def slider ():
30
+ global text ,count ,s
31
+ if count == len (s ):
32
+ count = 0
33
+ text = ''
34
+ text = text + s [count ]
35
+ sliderLabel .config (text = text )
36
+ count = count + 1
37
+ sliderLabel .after (150 ,slider )
38
+
39
+ #Slider
40
+ sliderLabel = Label (window ,font = ('arial' ,35 ,'bold' ,'italic' ),foreground = 'royalblue' ,width = 30 )
41
+ sliderLabel .place (x = 300 ,y = 25 )
42
+ slider ()
43
+ algorithm_name = StringVar ()
44
+ data = []
45
+ algo_list = ['Bubble Sort' , 'Insertion Sort' , 'Selection Sort' , 'Merge Sort' , 'Quick Sort' ]
46
+
47
+
48
+ # Drawing the numerical array as bars
49
+ def drawData (data , colorArray ):
50
+ canvas .delete ("all" )
51
+ canvas_height = 360
52
+ canvas_width = 1300
53
+ bar_width = canvas_width / (len (data ) + 1 )
54
+ border_offset = 30
55
+ spacing = 10
56
+ normalized_array = [ i / max (data ) for i in data ]
57
+ for i , height in enumerate (normalized_array ):
58
+ #top left coordinates
59
+ x0 = i * bar_width + border_offset + spacing
60
+ y0 = canvas_height - height * 340
61
+ #bottom right coordinates
62
+ x1 = (i + 1 ) * bar_width + border_offset
63
+ y1 = canvas_height
64
+ canvas .create_rectangle (x0 ,y0 ,x1 ,y1 ,fill = colorArray [i ])
65
+ canvas .create_text (x0 + 2 ,y0 ,anchor = SW ,text = str (data [i ]))
66
+
67
+ window .update_idletasks ()
68
+
69
+
70
+ # Randomly generate array
71
+ def generate ():
72
+ global data
73
+ lowest = int (lowest_Entry .get ())
74
+ highest = int (highest_Entry .get ())
75
+ size = int (arrsize_Entry .get ())
76
+
77
+ data = []
78
+ for i in range (size ):
79
+ data .append (random .randrange (lowest , highest + 1 ))
80
+
81
+ drawData (data ,['red' for x in range (len (data ))])
82
+
83
+
84
+ def sort ():
85
+ global data
86
+
87
+ if algo_menu .get () == 'Bubble Sort' :
88
+ bubble_sort (data , drawData , sortingspeed .get ())
89
+ elif algo_menu .get () == 'Selection Sort' :
90
+ selection_sort (data , drawData , sortingspeed .get ())
91
+ elif algo_menu .get () == 'Insertion Sort' :
92
+ insertion_sort (data , drawData , sortingspeed .get ())
93
+ elif algo_menu .get () == 'Merge Sort' :
94
+ merge_sort (data , 0 , len (data )- 1 , drawData , sortingspeed .get ())
95
+ elif algo_menu .get () == 'Quick Sort' :
96
+ quick_sort (data , 0 , len (data )- 1 , drawData , sortingspeed .get ())
97
+
98
+
99
+ ### User interface ###
100
+ UI_frame = Frame (window , width = 700 , height = 300 , bg = 'green' )
101
+ UI_frame .place (x = 450 ,y = 95 )
102
+
103
+ canvas = Canvas (window ,width = 1340 , height = 350 , bg = 'grey' )
104
+ canvas .place (x = 10 ,y = 340 )
105
+
106
+ l1 = Label (UI_frame , text = "Algorithm Choice : " )
107
+ l1 .grid (row = 0 , column = 0 , padx = 10 , pady = 10 )
108
+
109
+ algo_menu = ttk .Combobox (UI_frame , textvariable = algorithm_name , values = algo_list ,width = 10 ) #ttk library
110
+ algo_menu .grid (row = 0 , column = 1 , padx = 5 , pady = 5 )
111
+ algo_menu .current (0 )
112
+
113
+ sortingspeed = Scale (UI_frame , from_ = 0.1 , to = 2.0 , length = 100 , digits = 2 , resolution = 0.2 , orient = HORIZONTAL , label = "Sorting Speed " )
114
+ sortingspeed .grid (row = 0 , column = 2 , padx = 10 , pady = 10 )
115
+
116
+ Button (UI_frame , text = "Start Sorting" ,font = ('bold' ), command = sort , bg = 'red' ,height = 5 ).grid (row = 0 , column = 3 , padx = 5 , pady = 5 )
117
+
118
+ lowest_Entry = Scale (UI_frame , from_ = 5 , to = 20 , resolution = 1 , orient = HORIZONTAL , label = "Lower Limit" )
119
+ lowest_Entry .grid (row = 1 , column = 0 , padx = 5 , pady = 5 )
120
+
121
+ highest_Entry = Scale (UI_frame , from_ = 20 , to = 100 , resolution = 1 , orient = HORIZONTAL , label = "Upper Limit" )
122
+ highest_Entry .grid (row = 1 , column = 1 , padx = 5 , pady = 5 )
123
+
124
+ arrsize_Entry = Scale (UI_frame , from_ = 5 , to = 25 , resolution = 1 , orient = HORIZONTAL , label = "Array size" )
125
+ arrsize_Entry .grid (row = 1 , column = 2 , padx = 5 , pady = 5 )
126
+
127
+ Button (UI_frame , text = "Current Array" ,font = ('bold' ), command = generate , bg = 'blue' ,height = 5 ).grid (row = 1 , column = 3 , padx = 10 , pady = 10 )
128
+
129
+ window .mainloop ()
0 commit comments