Tkinter - problem z odczywtywaniem danych z Entry

0

Witam!
Chciałem sobie napisać prostą aplikację zliczającą wynagrodzenie, godziny itd. w ramach treningu, ponieważ dopiero zaczynam z programowaniem.
Przy pomocy biblioteki TkInter chciałem stworzyć proste GUI, gdzie wyświetlałyby się informacje oraz osobne okienko do dodawania danych i właśnie z tym okienkiem miałem problem.

Klasa odpowiadająca za obsługę danych, może nie jest napisana idealnie oraz nie sprawdza poprawności wprowadzanych danych, ale najbardziej mi chodziło o zapoznanie się z tkinter:

class Praca:
    def wczytaj(self):
        with open("godziny.txt", 'r') as godz:
            x = godz.read()
            self.__godz = x.split("\n")
            l = len(self.__godz) - 1
            del self.__godz[l]
        with open("tips.txt", 'r') as tips:
            y = tips.read()
            self.__tips = y.split("\n")
            l = len(self.__tips) - 1
            del self.__tips[l]
        with open("wynagrodzenie.txt", 'r') as hajs:
            z = hajs.read()
            self.__hajs = z.split("\n")
            l = len(self.__hajs) - 1
            del self.__hajs[l]
        with open("dni.txt", 'r') as dni:
            d = dni.read()
            self.__dni = d.split("\n")
            l = len(self.__dni) - 1
            del self.__dni[l]

    def zapisz(self):
        with open("godziny.txt", 'w') as godz:
            for i in self.__godz:
                godz.write(i+"\n")
        with open("tips.txt", 'w') as tips:
            for i in self.__tips:
                tips.write(i+"\n")
        with open("wynagrodzenie.txt", 'w') as hajs:
            for i in self.__hajs:
                hajs.write(i+"\n")
        with open("dni.txt", 'w') as dni:
            for i in self.__dni:
                dni.write(i+"\n")

    def dodaj(self,godziny,tips,dni):
        self.__godz.append(str(godziny))
        self.__hajs.append(str(16*float(godziny)))
        self.__tips.append(str(tips))
        self.__dni.append(str(dni))


    def suma(self):
        s_nap = 0
        s_wyn = 0
        s_wyn_n = 0
        s_godz = 0

        for i in self.__tips:
            s_nap+=float(i)
        for i in self.__hajs:
            s_wyn+=float(i)
        for i in self.__godz:
            s_godz+=float(i)
        s_wyn_n = s_nap + s_wyn

        return [s_nap, s_wyn, s_wyn_n, s_godz]

Kod GUI:

import tkinter as tk
import PIL
from Wynagrodzenie import Praca

work = Praca()

def Dodaj_dane(event):
    godziny_var = tk.StringVar()
    data_var = tk.StringVar()
    napiwki_var = tk.StringVar()
    
    #okno wyskakujace, zeby dodac dane
    okno = tk.Tk()
    okno.geometry("400x300")
    okno.title("Dodaj dane")

    topFrame = tk.Frame(okno)
    topFrame.place(x=0, y=70)
    botFrame = tk.Frame(okno)
    botFrame.pack(side=tk.BOTTOM)

    tk.Label(topFrame, text='Data').grid(row=1, column=1, padx=4, pady=4)
    tk.Label(topFrame, text='Godziny').grid(row=1, column=2, padx=4, pady=4)
    tk.Label(topFrame, text='Napiwki').grid(row=1, column=3, padx=4, pady=4)

    data = tk.Entry(topFrame, textvariable=data_var)
    data.grid(row=2, column=1, padx=4, pady=4)
    godziny = tk.Entry(topFrame, textvariable=godziny_var)
    godziny.grid(row=2, column=2, padx=4, pady=4)
    napiwki = tk.Entry(topFrame, textvariable=napiwki_var)
    napiwki.grid(row=2, column=3, padx=4, pady=4)

    dodaj = tk.Button(botFrame, text="Dodaj")
    dodaj.grid(row=1, column=2, padx=2, pady=40)
    dodaj.bind("<Button-1>", lambda g=godziny_var.get(),t=napiwki_var.get(), d=data_var.get(): work.dodaj(g, t, d))
    #dodaj.bind("<Button-1>", work.dodaj(godziny_var.get(), napiwki_var.get(), data_var.get()))

    okno.mainloop()

#Glowne okno
root = tk.Tk()
root.geometry("600x300")
root.title("Wynagrodzenie")

work.wczytaj()
print(work.suma())

b = tk.Button(root, text="Dodanie danych")
b.bind("<Button-1>",Dodaj_dane)
b.pack(side = tk.BOTTOM)

root.mainloop()

Nie rozumiem komunikatu o błędzie, który wyrzuca mi program, bo wpisując 10 w rubrykę godziny wszystko powinno działać i nie wiem do końca jak sobie z tym poradzić.
"TypeError: float() argument must be a string or a number, not 'Event'"

Z góry dziękuję za pomoc!

0

Nie walczyłem z całym programem tylko z tkinterem. Spróbuj przekazać do work data.get(), godziny.get(), napiwki.get()
Czyli get dla objektów Entry. Dodatkowo ta lambda z bind coś mi nie chciała działać to odczyt dałem w dodatkowej funkcji wewnątrz tej funkcji "Dodaj_dane". Trochę pokręcone, ale może u Ciebie zadziała.

def Dodaj_dane(event):
    def: wypisz():
        print("Dane", data.get(), napiwki.get(), godziny.get())
        return

Pewnie mnie zjedzą tutaj, ale fajnie dla czytelności dodawać coś do nazw, np: tk_data, tk_napiwki... . I wtedy wiesz z czym to się je.

Pozdrawiam
Radosław Głębicki

1 użytkowników online, w tym zalogowanych: 0, gości: 1