python забывает переменные, введённые ранее

from tkinter import *
from tkinter import Entry

window = Tk()
window.title("aboba")
window.geometry('800x800')


# МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ МОДУЛЬ

#ПЕРЕМЕННЫЕ


#ПЕРЕМЕННЫЕ
# ФУНКЦИИ
def clicked1():
    lbl1.configure(text="Принято!")
    v0 = int(txt1.get())
    print(v0)

def clicked2():
    lbl2.configure(text="Принято!")
    g_physic = int(txt2.get())
    print(g_physic)
def clicked3():
    lbl3.configure(text="Принято!")
    hei = int(txt3.get())
    print(hei)

# ФУНКЦИИ

# КНОПКИ
lbl1 = Label(window, text="Начальная скорость")
lbl1.place(y=25, x=15)
txt1 = Entry(window, width=10)
txt1.place(y=45, x=19)
btn2 = Button(window, text="ОК", bg="light coral", command=clicked1)
btn2.place(y=44, x=85)
# КНОПКИ

# ТЕКСТ
lbl3 = Label(window, text="Ускорение свободного падения")
lbl3.place(y=125, x=15)
lbl2 = Label(window, text="Высота выстрела")
lbl2.place(y=75, x=15)
txt2 = Entry(window, width=10)
txt2.place(y=95, x=19)
btn = Button(window, text="ОК", bg="light coral", command=clicked2)
btn.place(y=94, x=85)
# ТЕКСТ

# СТРОКИ ВВОДА
txt3 = Entry(window, width=10)
txt3.place(y=145, x=19)
btn = Button(window, text="ОК", bg="light coral", command=clicked3)
btn.place(y=144, x=85)
# СТРОКИ ВВОДА
def graf1():
    print(v0, g_physic, hei)
    btn1.configure(text='Рассчитано')
    f = (v0 ** 2 / (2 * v0 ** 2 + 2 * g_physic * hei))


    canv = Canvas(root, width = 1000, height = 1000, bg = "white")
    canv.create_line(500,1000,500,0,width=2,arrow=LAST)
    canv.create_line(0,500,1000,500,width=2,arrow=LAST)

    First_x = -500;


    for i in range(16000):
        if (i % 800 == 0):
            k = First_x + (1 / 16) * i
            canv.create_line(k + 500, -3 + 500, k + 500, 3 + 500, width = 0.5, fill = 'black')
            canv.create_text(k + 515, -10 + 500, text = str(k), fill="purple", font=("Helvectica", "10"))
            if (k != 0):
                canv.create_line(-3 + 500, k + 500, 3 + 500, k + 500, width = 0.5, fill = 'black')
                canv.create_text(20 + 500, k + 500, text = str(k), fill="purple", font=("Helvectica", "10"))
        try:
            x = First_x + (1 / 16) * i
            new_f = f.replace('x', str(x))
            y = -eval(new_f) + 500
            x += 500
            canv.create_oval(x, y, x + 1, y + 1, fill = 'black')
        except:
            pass
    canv.pack()

btn1 = Button(window, text="Рассчитать", bg="light coral", command=graf1)
btn1.place(y=64, x=95)

mainloop()

После ввода данных в строки ввода txt1, txt2, txt3 данные записываются в переменные v0, g_physic, hei, но при запуске функции graf1 они исчезают.


Ответы (1 шт):

Автор решения: CrazyElf

v0, g_physic, hei - это локальные переменные внутри функций. Чтобы они были глобально видимы, внутри функций нужно объявлять их глобальными, прежде чем им что-то присваивать. Например:

def clicked1():
    global v0 # переменная v0 теперь будет восприниматься как глобальная
    lbl1.configure(text="Принято!")
    v0 = int(txt1.get())
    print(v0)

При чтении глобальной переменной не нужно делать дополнительных телодвижений, только при её записи внутри функции нужно указывать global.

→ Ссылка