(początkujący) Tkinter - pomocy!

0

Witam, mam taki kod i za czorta nie potrafię znaleźć błędu. Wyskakuje mi taki błąd:

line 9, in zapisz
imie1 = str(imie.get())
NameError: name 'imie' is not defined

Co robię źle? Czy ktoś może mi to wytłumaczyć?


from tkinter import*
from tkinter import messagebox

root = Tk()
root.title('to jest tytul')
topFrame = Frame(root, width=1200, height = 600).pack()

def zapisz():
    imie1 = str(imie.get())
    Label(root, text = imie1).place(x = 100, y = 200)

def popup():
    messagebox.showinfo("Info!", "Ten dział jest jeszcze w budowie!\n \nBądź cierpliwy, już niedługo wszystko wróci do normy!")

def o_autorze():
    return

def newUser():
    top = Toplevel()
    top.title('Dadaj użytkownika')
    topFrame = Frame(top, width=1200, height=600)
    topFrame.pack()
    t1 = Label(top, text = "twoje imie:").place(x = 10, y = 10)
    imie = Entry(top, width = 20).place(x = 200, y = 10)
    b1 = Button(top, text = "wyslij", command = zapisz).place(x = 100, y = 200)


b = Button(root, text = "Nowy użytkownik", fg = "blue", command = newUser).place(x = 10, y = 10)
b1 = Button(root, text="Zapisz poziom cukru", fg = "blue", command = popup).place(x = 180, y = 10)
b2 = Button(root, text="Sprawdź historię poziomów cukru", fg = "blue", command = popup).place(x = 360, y = 10)
b10 = Button(root, text = "O autorze", fg = "green", command = o_autorze).place(x = 600, y = 10)


root.mainloop()
1

Nie zdefiniowales zmiennej imie python nie może na niej wykonać metody.

0

Nie bardzo wiem jak i gdzie ją wstawić

0

imie1 ma być "skastowanym" do stringa czymś, co jakaś metoda get pobierze ze zmiennej imie. Pytanie do Ciebie, skąd to, co to ma być, jakiego to typu? Jakiś pomysł Miałeś pisząc tę linijkę.

0

Piszę program dla siebie który ma za zadanie:

  1. zapisywanie poziomu cukru
  2. rejestrowanie użytkownik( zapis wszystkich danych do plików tekstowych)
    2 wyświetlanie wyników

jak się poduczę program będzie miał więcej funkcji.
utknąłem na przekazywaniu danych z pól Entry które chciałbym zapisać do pliku tekstowego.


from tkinter import *
from time import strftime



okno = Tk()
okno.title("Cukrzyca v 2.0")
topFrame = Frame(okno, width = 1200)
topFrame.pack()

def zapisz():
    global imie
    imie1 = imie.get()
    nazwisko1 = nazwisko.get()
    Label(root, text = imie1).place(x = 100, y = 200)
    Label(root, text = nazwisko1).place(x = 100, y= 220)
    # ????????? i tutaj utknąłem - chyba????????????


def time():
    string = strftime('%H:%M:%S')
    lbl.config(text = string)
    lbl.after(1000, time)

def nowyUser():
    okno.destroy()
    user = Tk()
    user.title("Zarejestruj nowego użytkownika")
    topFrame = Frame(user, width=1200, height = 600)
    topFrame.pack()

    #  *** Informacja ***
    l1 = Label(user, text = "Wszystkie podane dane zostaną zapisane tylko na dysku w odpowiednim pliku.", font = ("calibri", 10, "normal"), foreground = "red").place(x = 20, y = 10)
    l1a = Label(user, text = " Nie są nigdzie przesyłane!!!", font = ("calibri", 10, "bold"), foreground = "red").place(x = 550, y = 10)
    l2 = Label(user, text = "Dodanie danych lekarza do programu jest dobrym posunięciem. Program w przyszłości będzie posiadał możliwość wysyłania wiadomości dotyczące Twojego stanu zdrowia oraz\n"
                            "tygodniowe i miesięczne raporty.", font = ("calibri", 9, "italic"), foreground = "black").place(x = 20, y = 30)


    # *** pobieranie danych użytkownika ***
    linia1 = Label(user, text = "Podaj imię:", font = ("calibri", 10, "bold"), foreground = "green").place(x = 10, y =120)
    linia2 = Label(user, text = "Podaj nazwisko:", font = ("calibri", 10, "bold"), foreground = "green").place(x= 10, y = 150)
    linia3 = Label(user, text = "Dzień urodzenia:", font = ("calibri", 10, "bold"), foreground = "green").place(x = 10, y = 180)
    linia4 = Label(user, text = "Miesiąc urodzenia(słownie):", font = ("calibri", 10, "bold"), foreground = "green").place(x=10, y=210)
    linia5 = Label(user, text = "Rok urodzenia(1234):", font = ("calibri", 10, "bold"), foreground = "green").place(x = 10, y = 240)
    linia6 = Label(user, text = "Nr telefonu:", font = ("calibri", 10, "bold"), foreground = "green").place(x = 10, y = 270)
    linia7 = Label(user, text = "Email:", font = ("calibri", 10, "bold"), foreground = "green").place(x=10, y=300)


    imie = Entry(user, width=35).place(x=240, y=120)
    nazwisko = Entry(user, width=35).place(x=240, y=150)
    dzienUrodzenia = Entry(user, width=35).place(x=240, y=180)
    miesiacUrodzenia = Entry(user, width=35).place(x=240, y=210)
    rokUrodzenia = Entry(user, width=35).place(x=240, y=240)
    nrTelefonu = Entry(user, width=35).place(x=240, y=270)
    email = Entry(user, width=35).place(x=240, y=300)

    # *** Pobieranie danych lekarza ***
    linia8 = Label(user, text = "Imię Lekarza:", font = ("calibri", 10, "bold"), foreground = "blue").place(x = 600, y =120)
    linia9 = Label(user, text = "Nazwisko Lekarza:", font = ("calibri", 10, "bold"), foreground = "blue").place(x = 600, y =150)
    linia10 = Label(user, text = "Nr telefonu:", font = ("calibri", 10, "bold"), foreground = "blue").place(x = 600, y = 180)
    linia11 = Label(user, text = "Email:", font = ("calibri", 10, "bold"), foreground = "blue").place(x = 600, y = 210)
    imieLekarza = Entry(user, width=35).place(x = 780, y = 120)
    nazwiskoLekarza = Entry(user, width=35).place(x = 780, y =150)
    telefonLekarza = Entry(user, width=35).place(x = 780, y =180)
    emailLekarza = Entry(user, width=35).place(x = 780, y =210)

    b1 = Button(user, text="Wyślij", command = zapisz).place(x=600,y=500)

    user.mainloop()

def user():
    global okno
    okno.quit()


lbl = Label(okno, font = ("calibri", 40, "bold"))

lbl.pack(anchor = "center")
time()

etykieta1 = Label(okno, text = "Drogi użytkowniku!", font = ("calibri", 16, "bold"), foreground = "green")
etykieta1.pack()

etykieta2 = Label(okno, text = "Miło mi że skorzystałeś z mojego pierwszego programu \"Cukrzyca\"w wersji okienkowej.", foreground = "green")
etykieta2.pack()

etykieta3 = Label(okno, text = "Program jest w pełni darmowy, do użytku publicznego. Przeznaczony jest dla ludzi chorych na cukrzycę\n"
                               "I i II stopnia. Ma pomagać w samokontroli poziomów cukru oraz utrzymywaniu określonej diety.\n", foreground = "green")
etykieta3.pack()

etykieta4 = Label(okno, text = "\"Cukrzyca\" jest w fazie rozwoju. Jestem początkującym programistą w języku Python. Myślę że mam\n"
                               "ciekawą koncepcję na stworzenie tego programy. Wraz z zagnębianiem się w tajniki programowania, \n"
                               "program będzie zmieniał swoją strukturę i wygląd, aż w pełni spełni moje i użytkownika oczekiwania.", foreground = "green")
etykieta4.pack()

etykieta5 = Label(okno, text = "----------------------------------------------------------------------------------------------------------------", foreground = "green")
etykieta5.pack()

etykieta6 = Label(okno, text = "Jeśli masz jakieś uwagi dotyczące działania programu lub jakieś propozycje dotyczące rozwoju\n"
                               "programu, proszę napisz na adres email: [email protected]. Bardzo chętnie przeczytam uwagi\n"
                               "i propozycje dotyczące programu.\n\n", foreground = "green")
etykieta6.pack()

przycisk = Button(okno, text = "Nowy użytkownik", command = nowyUser).pack()
przycisk = Button(okno, text = "Mam już konto", command = user).pack()



okno.mainloop()


0

Zmienną imie definiujesz w funkcji nowyUser, a w zapisz ma być zmienną globalną. Tak sie nie da. Póki jeszcze czas zrefaktoruj to, zrób klasę (albo kilka), jeśli kilka metod uzywa imie, to niech ono będzie polem klasy. W takim "dizajnie", (jak teraz MAsz) complexity, refaktorowanie i debugowanie, Cię "zabije".

0

ok, zacznę pisać od nowa. Dzięki za pomoc
Muszę się jeszcze wiele nauczyć. :)

0

Zanim zaczniesz piac, taką, w sumie dość skomplikowaną apkę, to, jak nie Masz jeszcze doświadczenia, to Sobie przeczytaj najpierw coś do "czystego kodu"; zainwestowany czas i tak odzyskasz.

0

ok. Jeszcze raz dzięki

0

A czy z czystej ciekawości mógłbyś mi napisać jak skastować imie1 na stringa i gdzie w kodzie powinienem to zrobić? Chciałbym to wizualnie zobaczyć i zrozumieć. Będę wdzięczny.

0

Powinieneś przekazać imie jako argument do funkcji zapisz, ale jak pewnie zauważyłeś przekazujesz tę funkcję jako argument przy deklaracji przycisku. Możesz użyć lambdy żeby przekazać argument bez wywoływania funkcji.
Button(user, text="Wyślij", command=lambda: zapisz(imie)
https://docs.python.org/3/tutorial/controlflow.html#lambda-expressions

0

Dzięki za podpowiedzi i pomoc. Pisze od nowa i spróbuje class.

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