How do I fix this error when creating a tkinter button?

31 Views Asked by At
from tkinter import *
import pickle
from tkinter import messagebox
from tkinter import ttk

Id = 0
Idx800 = 0
Idx900 = 0

class Vozac():
    def __init__(self,ime,prezime):
        self.Ime = ime
        self.Prezime = prezime
        global Id
        self.Id = Id
        Id = Id + 1
        self.termini = []

    def dodajTermin(self,termin):
        self.termini.append(termin)

    def obrisiTermin(self,termin):
        self.termini.remove(termin)

def dodajVozaca():
    new_window = Toplevel()
    new_window.geometry("400x200")

    label1 = Label(new_window,text="Ime:", font=('Arial',30))
    label1.place(x=50,y=0)
    global entry1
    entry1 = Entry(new_window, font=('Arial',30))
    entry1.place(x=180,y=0)

    label2 = Label(new_window, text="Prezime:", font=('Arial', 30))
    label2.place(x=0, y=50)
    global entry2
    entry2 = Entry(new_window, font=('Arial', 30))
    entry2.place(x=180, y=50)

    submit_button = Button(new_window, text="Dodaj vozaca", font=('Arial', 25), command=lambda: vozacHandler(entry1, entry2, new_window))
    submit_button.place(x=100,y=100)

def vozacHandler(entry1, entry2, new_window):
    ime = entry1.get()
    prezime = entry2.get()
    new_window.destroy()
    zastavica = 1
    dodajVozacaNaGUI(ime, prezime, zastavica)

def dodajVozacaNaGUI(ime, prezime, zastavica):
    vozac = Vozac(ime, prezime)
    button = Button(window, text=ime+" "+prezime, command=lambda: prikaziTermine(vozac, button))
    if vozac.Id < 25:
        button.grid(row=vozac.Id, column = 0)
    if vozac.Id < 50 and vozac.Id >= 25:
        button.grid(row=vozac.Id-25, column = 1)
    if vozac.Id < 75 and vozac.Id >= 50:
        button.grid(row=vozac.Id-50, column = 2)
    if vozac.Id < 100 and vozac.Id >= 75:
        button.grid(row=vozac.Id-75, column = 3)
    if zastavica:
        spremiVozaca(vozac)

def spremiVozaca(vozac):
    pickle_out = open("vozaci.pickle", "ab")
    pickle.dump(vozac, pickle_out)
    pickle_out.close()

def on_closing():
    if messagebox.askokcancel("Izlazak", "Da li zelite izaci?"):
        window.destroy()

def prikaziTermine(vozac, button1):
    new_window = Toplevel()
    new_window.geometry("400x300")
    pickle_in = open("vozaci.pickle", "rb")

    while 1:
        try:
            vozac1 = pickle.load(pickle_in)
            if vozac1.Ime == vozac.Ime and vozac1.Prezime == vozac.Prezime:
                for i in range(len(vozac1.termini)):
                    label = Label(new_window, text=vozac1.termini[i], font=('Arial', 25))
                    label.place(x=0, y=0 + 50 * i)

        except:
            EOFError
            break

    button = Button(new_window, text="Obrisi vozaca", font=('Arial', 25), command=lambda: obrisiVozaca(vozac, button1, new_window))
    button.place(x=100, y=220)

def obrisiVozaca(vozac, button, new_window):
    new_window.destroy()
    button.destroy()
    pickle_in = open("vozaci.pickle", "rb")
    pickle_out = open("vozaci1.pickle", "ab")
    while 1:
        try:
            vozac1 = pickle.load(pickle_in)
            if vozac.Ime == vozac1.Ime and vozac.Prezime == vozac1.Prezime:
                global Id
                Id = Id-1
                for i in range(100):
                    vozac2 = pickle.load(pickle_in)
                    vozac2.Id = vozac2.Id-1
                    print(vozac2.Id)
                    print(vozac2.Ime)
                    pickle.dump(vozac2, pickle_out)
            else:
                pickle.dump(vozac1, pickle_out)
        except:
            EOFError
            pickle_out.close()
            break
    pickle_out1 = open("vozaci.pickle", "w").close()
    pickle_in1 = open("vozaci1.pickle", "rb")
    pickle_out2 = open("vozaci.pickle", "ab")
    while 1:
        try:
            vozac2 = pickle.load(pickle_in1)
            pickle.dump(vozac2, pickle_out2)
        except:
            EOFError
            pickle_out2.close()
            break
    pickle_out3 = open("vozaci1.pickle", "w").close()

def dodajTermin():
    new_window = Toplevel()
    new_window.geometry("400x200")
    linija = notebook.tab(notebook.select(), "text")

    label1 = Label(new_window, text="Termin:", font=('Arial', 30))
    label1.place(x=0, y=0)
    global entry
    entry = Entry(new_window, font=('Arial', 30))
    entry.place(x=150, y=0)

    submit_button = Button(new_window, text="Dodaj termin", font=('Arial', 25), command=lambda: terminHandler(entry, new_window, linija))
    submit_button.place(x=100, y=100)

def terminHandler(entry, new_window, linija):
    termin = entry.get()
    new_window.destroy()
    zastavica = 1
    dodajTerminNaGUI(termin, linija, zastavica)

def dodajTerminNaGUI(termin, linija, zastavica):
    if linija == "x800":
        global Idx800
        button1 = Button(tab1, text=termin, command=lambda: dodajTerminVozacu(termin, button1))
        button1.place(x=0,y=0+50*Idx800)
        Idx800 = Idx800+1
    if linija == "x900":
        global Idx900
        button2 = Button(tab2, text=termin, command=lambda: dodajTerminVozacu(termin, button2))
        button2.place(x=0,y=0+50*Idx900)
        Idx900 = Idx900+1
    if zastavica:
        spremiTermin(linija, termin)

def spremiTermin(linija, termin):
    if linija == "x800":
        pickle_out = open("terminix800.pickle", "ab")
        pickle.dump(termin, pickle_out)
        pickle_out.close()
    if linija == "x900":
        pickle_out1 = open("terminix900.pickle", "ab")
        pickle.dump(termin, pickle_out1)
        pickle_out1.close()

def dodajTerminVozacu(termin, button):
    new_window = Toplevel()
    new_window.geometry("500x900")
    pickle_in = open("vozaci.pickle", "rb")
    i = 0
    vozaci = []

    while 1:
        try:
            vozaci.append(pickle.load(pickle_in))
            button1 = Button(new_window, text=vozaci[i].Ime + " " + vozaci[i].Prezime, command=lambda: dodavanjeTermina(vozaci[i], termin, button, new_window))
            if vozaci[i].Id < 25:
                button1.grid(row=vozaci[i].Id, column=0)
            if vozaci[i].Id < 50 and vozaci[i].Id >= 25:
                button1.grid(row=vozaci[i].Id - 25, column=1)
            if vozaci[i].Id < 75 and vozaci[i].Id >= 50:
                button1.grid(row=vozaci[i].Id - 50, column=2)
            if vozaci[i].Id < 100 and vozaci[i].Id >= 75:
                button1.grid(row=vozaci[i].Id - 75, column=3)
            i = i + 1

        except:
            EOFError
            break

def dodavanjeTermina(vozac,termin, button, new_window):
    #print(id)
    pickle_in = open("vozaci.pickle", "rb")
    pickle_out = open("vozaci1.pickle", "ab")
    while 1:
        try:
            vozac1 = pickle.load(pickle_in)
            if vozac1.Ime == vozac.Ime and vozac1.Prezime == vozac.Prezime:
                vozac1.dodajTermin(termin)
                pickle.dump(vozac1, pickle_out)
            else:
                pickle.dump(vozac1, pickle_out)

        except:
            EOFError
            pickle_out.close()
            break
    pickle_in1 = open("vozaci.pickle", "w").close()
    pickle_in2 = open("vozaci1.pickle", "rb")
    pickle_out1 = open("vozaci.pickle", "ab")

    while 1:
        try:
            vozac2 = pickle.load(pickle_in2)
            pickle.dump(vozac2, pickle_out1)
        except:
            EOFError
            pickle_out1.close()
            break
    pickle_out2 = open("vozaci1.pickle", "w").close()
    button.destroy()
    #tu treba obrisati termin iz picklea
    new_window.destroy()


if __name__ == '__main__':
    window = Tk()
    window.geometry("2000x1100")

    menubar = Menu(window)
    window.config(menu=menubar)
    fileMenu = Menu(menubar, tearoff=0)
    menubar.add_cascade(label="Opcije", menu=fileMenu)
    fileMenu.add_command(label="Dodaj vozaca", command=dodajVozaca)
    fileMenu.add_command(label="Dodaj termin", command=dodajTermin)

    notebook = ttk.Notebook(window)
    tab1 = Frame(notebook, width=1400, height=900, bg="red")
    tab2 = Frame(notebook, width=1400, height=900, bg="blue")
    notebook.add(tab1, text="x800")
    notebook.add(tab2, text="x900")
    notebook.place(x=500, y=0)

    window.protocol("WM_DELETE_WINDOW", on_closing)

    pickle_inx = open("vozaci.pickle", "rb")

    while 1:
        try:
            vozac11 = pickle.load(pickle_inx)
            dodajVozacaNaGUI(vozac11.Ime, vozac11.Prezime, 0)
        except:
            EOFError
            break

    pickle_in1x = open("terminix800.pickle", "rb")

    while 1:
        try:
            termin = pickle.load(pickle_in1x)
            dodajTerminNaGUI(termin, "x800", 0)
        except:
            EOFError
            break

    pickle_in2x = open("terminix900.pickle", "rb")

    while 1:
        try:
            termin = pickle.load(pickle_in2x)
            dodajTerminNaGUI(termin, "x900", 0)
        except:
            EOFError
            break

    window.mainloop()

Python says that I have list out of index error in line when I create a button (function-dodajTerminVozacu), I can't figure out why, I tried out printing data before its assigned to button and everything seems fine. Content of vozaci.pickle is 3 objects and every one of them includes: name, surname and id. Whenever I do pickle.load one object in series appears.

0

There are 0 best solutions below