1
+ from tkinter import *
2
+ from tkinter import ttk
3
+ from bubble_sort import startBubbleSort
4
+ import random
5
+
6
+ data = []
7
+
8
+ def visualise (algorithm ,speed ):
9
+ if algorithm == "Bubble sort" :
10
+ startBubbleSort (data ,drawData )
11
+
12
+
13
+
14
+ #function to move the main window with the cursor drag
15
+ def get_pos (event ):
16
+ xwin = root .winfo_x ()
17
+ ywin = root .winfo_y ()
18
+ startx = event .x_root
19
+ starty = event .y_root
20
+ ywin = ywin - starty
21
+ xwin = xwin - startx
22
+
23
+ def move_window (event ):
24
+ root .geometry ("800x600" + '+{0}+{1}' .format (event .x_root + xwin , event .y_root + ywin ))
25
+ startx = event .x_root
26
+ starty = event .y_root
27
+
28
+ topf .bind ('<B1-Motion>' , move_window )
29
+
30
+
31
+
32
+ #function to generate random data
33
+ def genData (data_size ):
34
+
35
+ global data
36
+ data = []
37
+ for _ in range (int (float (data_size ))):
38
+ data .append (random .randrange (1 ,100 ))
39
+ drawData (data )
40
+
41
+
42
+
43
+ #function to draw rectangles, 'data' is a list of rectangle heights
44
+ def drawData (data ):
45
+ #clears canvas before drawing new data
46
+ canvas .delete ("all" )
47
+ #setting canvas height,width
48
+ canvas_h = 380
49
+ canvas_w = 600
50
+ #setting the spacing between 2 rectangle
51
+ spacing = 20
52
+ #set the width of 1 rectangle
53
+ rectangle_w = (canvas_w - spacing * (len (data )- 1 ))/ len (data )
54
+
55
+ #normalizing the data
56
+ for i in range (len (data )):
57
+ data [i ]= data [i ]/ max (data )
58
+
59
+ #drawing the normalized data
60
+ for i ,height in enumerate (data ):
61
+ x0 = i * rectangle_w + (i + 1 )* spacing
62
+ y0 = canvas_h - height * (canvas_h - 20 )
63
+ x1 = (i + 1 )* rectangle_w + (i + 1 )* spacing
64
+ y1 = canvas_h
65
+ canvas .create_rectangle (x0 ,y0 ,x1 ,y1 ,fill = "grey" )
66
+ root .update_idletasks ()
67
+
68
+
69
+
70
+ #starts the gui
71
+ def main ():
72
+ global root
73
+ root = Tk ()
74
+ root .title ("Sorting Algorithm Visualizer" )
75
+ root .overrideredirect (1 )
76
+ root .maxsize (900 ,600 )
77
+ root .config (bg = 'black' )
78
+
79
+ #to store the selected algorithm
80
+ algorithm = StringVar ()
81
+
82
+ #top frame for user input
83
+ global topf
84
+ topf = Frame (root ,width = 600 , height = 200 , bg = 'grey' )
85
+ topf .grid (row = 0 ,column = 0 ,padx = 10 ,pady = 5 )
86
+ topf .bind ('<Button-1>' , get_pos )
87
+
88
+ #row 1 of topf
89
+ Label (topf ,text = "Select Algorithm" ,bg = 'grey' ).grid (row = 0 ,column = 0 ,padx = 5 ,pady = 5 ,sticky = W )
90
+ algorithm_menu = ttk .Combobox (topf ,textvariable = algorithm ,values = ['Bubble sort' ,'Selection Sort' ])
91
+ algorithm_menu .grid (row = 0 ,column = 1 ,padx = 5 ,pady = 5 )
92
+ algorithm_menu .current (0 )
93
+ Button (topf ,text = "Visualise" ,bg = 'white' ,command = lambda : visualise (algorithm .get (),speed .get ())).grid (row = 0 ,column = 2 ,padx = 5 ,pady = 5 )
94
+
95
+ #row 2 of topf
96
+ global size ,speed
97
+ size = IntVar ()
98
+ speed = IntVar ()
99
+ Label (topf ,text = "Size" ,bg = 'grey' ).grid (row = 1 ,column = 0 ,padx = 5 ,pady = 5 ,sticky = W )
100
+ size_scale = ttk .Scale (topf ,variable = size ,from_ = 3 ,to = 100 ,command = genData )
101
+ size_scale .grid (row = 1 ,column = 1 ,padx = 5 ,pady = 5 )
102
+ size .set (50 )
103
+
104
+ Label (topf ,text = "Step Speed (sec)" ,bg = 'grey' ).grid (row = 1 ,column = 2 ,padx = 5 ,pady = 5 ,sticky = W )
105
+ speed_scale = ttk .Scale (topf ,variable = speed ,from_ = 0.1 ,to = 1.0 )
106
+ speed_scale .grid (row = 1 ,column = 3 ,padx = 5 ,pady = 5 )
107
+
108
+
109
+ #canvas for visualisation
110
+ global canvas
111
+ canvas = Canvas (root ,width = 600 ,height = 380 ,bg = 'black' )
112
+ canvas .grid (row = 1 ,column = 0 ,padx = 10 ,pady = 5 )
113
+ # data=genData(50)
114
+ # drawData(data)
115
+
116
+
117
+
118
+
119
+ root .mainloop ()
120
+
121
+ if __name__ == "__main__" :
122
+ main ()
0 commit comments