Paola Vilaseca
Paola Vilaseca

Reputation: 67

Write text into canvas python tkinter

I have all the gui configurations and all that stuff in my main.py and my algorithms to draw bubble sort and merge sort in another .py file. I'm trying to write the print functions into my canvas but I'm not sure how to do it, can anyone help? I tried using a ListBox() but it messes up the main canvas for some reason.

This is my code for my main file:

from tkinter import * 
from tkinter import ttk 
from tkinter import messagebox 
from bubbleSort import bubbleSort
from mergeSort import mergeSort

tk = Tk()
tk.title('Examen Final')
tk.maxsize(900, 600)
tk.config(bg = 'black')

algoritmo = StringVar()
data = []

def dibujar(data, color):
    c.delete("all") 
    cHeight = 380
    cWidth = 600 
    
    algoWidth = cWidth /  (len(data) + 1)
    algoHeight = cWidth /  (len(data) + 1)
    offset = 20
    spacing = 10

    tamData = [i / max(data) for i in data]

    for i, height in enumerate(tamData):
        
        x0 = i * algoWidth + offset + spacing
        y0 = cHeight - height * 50

        
        x1 = (i+1) * algoWidth + offset
        y1 = cHeight 

        c.create_oval(x0,y0,x1,y1, fill = color[i])
        c.create_text(x0+2,y0, anchor = SW, text=str(data[i]))

    tk.update_idletasks()

def Ordenar():
    print("Se selecciono: " + algoritmo.get())
    print("Iniciando algoritmo")

    global data 
    
    if menu.get() == 'MERGE SORT':
        mergeSort(data, dibujar)

    elif menu.get() == 'BUBBLE SORT':
        bubbleSort(data, dibujar)

    dibujar(data, ['green' for x in range(len(data))])

def agregar():
    global data 
    
    input =  int(inputVal.get())
    inputVal.delete(0, END)

    try: 
        
        print("valor input:")
        print(input)
        
        data.append((input)) 
        print(str(data))

        dibujar(data, ['red' for x in range(len(data))])
        
    except:
        messagebox.showerror("Error", "Ingrese un valor numerico")

def limpiar():
    global data 
    data = []
    c.delete("all") 
    print(data)
    
box = Frame(tk, width = 600, height = 200, bg = 'black' )
box.grid(row = 0, column = 0, padx=10, pady=5)

c = Canvas(tk, width = 600, height = 380,  bg = 'grey')
c.grid(row = 1, column = 0, padx=10, pady=5)

c2 = Canvas(tk, width = 200, height = 380,  bg = 'grey')
c2.grid(row = 1, column = 1, padx=10, pady=5)

label = Label(box, text='Lista Algoritmos: ', font = ("Arial",15), borderwidth=1, bg = "black" , fg = 'white')
label.grid(row=0,column=0,  padx=5, pady=5, sticky = W)

menu = ttk.Combobox(box, textvariable = algoritmo, values=['BUBBLE SORT', 'MERGE SORT', 'HASH TABLES', 'ARBOL AVL', 'ARBOLES ROJO Y NEGRO'])
menu.grid(row=0, column=1, padx=5, pady=5)
menu.current(0)

botonStart = Button(box, text = 'Ordenar', command = Ordenar, bg = 'lime green')
botonStart.grid(row = 0, column = 2, padx = 5, pady = 5)

label = Label(box, text='Insertar valor: ', font = ("Arial",15), borderwidth=1, bg = "black" , fg = 'white')
label.grid(row=1,column=0, padx = 5, pady = 5, sticky = W)
inputVal = Entry(box)
inputVal.grid(row=1,column=1, padx = 5, pady = 5, sticky = W)

botonAdd = Button(box, text = 'Agregar', command = agregar, bg = 'lime green')
botonAdd.grid(row = 1, column = 2,  padx = 5, pady = 5, sticky = W)

botonClear = Button(box, text = 'Limpiar', command = limpiar, bg = 'lime green')
botonClear.grid(row = 1, column = 3,  padx = 5, pady = 5, sticky = W)

tk.mainloop()

and this is my bubbleSort.py

import time 

def bubbleSort(data, dibujar):
    for _ in range(len(data)-1): 
        for j in range(len(data)-1):
            if data[j] > data[j+1]:
                print(("El numero " + str(data[j]) + " es mayor que " + str(data[j+1])))

                data[j],data[j+1] = data[j+1], data[j] 
                print(("Intercambiando de lugar " + str(data[j]) + " con " + str(data[j+1])))
                
                dibujar(data, 
                    [
                    'green' 
                    if x == j or x  == j+1 
                    else 'red' for x in range(len(data))
                    ]
                )
                time.sleep(1)
    dibujar(data, ['green' for x in range(len(data))])

Upvotes: 1

Views: 600

Answers (1)

Delrius Euphoria
Delrius Euphoria

Reputation: 15098

You can just pass in c2 to the function on the other file. So first define the parameter:

def bubbleSort(data, dibujar, cnv):
    cnv.create_text(100,100,text='Trial Text')
    ....

Now each time you call this function, pass on c2 to it.

if menu.get() == 'BUBBLE SORT':
    bubbleSort(data, dibujar, c2)

I did notice that you are using dynamic points for calculation, if so, make those points global, inside the function, then pass those onto the function by creating more parameter, while keeping in mind that the points have to defined before the function is called.

Upvotes: 1

Related Questions