передать введенные значения в поле tkinter из одной функции в другую

Рейтинг: 0Ответов: 2Опубликовано: 07.02.2023

Есть задача, где нужно с помощью tkinter считать периметры фигур. То есть создается окно с выбором 3 фигур, ты выбираешь создается еще окно, и в нем вводишь его стороны и тебе выдает периметр. Я новичок в данном деле так сказать, долго пытался ничего не получалось, не понимаю как исправить это, то как выглядит код, понимаю что можно было всяко легче как-то, но я попытался так, помогите с объяснением желательно.

Вот код:

from tkinter import *
from tkinter import messagebox
def calculate_per():
   n = int(kv.one.get())
   m = int(kv.two.get())
   per = (n+m)*2 
   messagebox.showinfo('Результат', f'Периметр квадрата= {per}')
def kv():
   window=Toplevel()
   window.title("Считаем периметр квадрата")
   window.geometry('500x200')
   frame = Frame(window,padx = 10,pady = 10)
   frame.pack(expand=True)
   stor_one_lb = Label(frame,text="Введите первую сторону (в см)  ")
   stor_one_lb.grid(row=3, column=1)
   one = Entry(frame,)
   one.grid(row=3, column=2)
   stor_two_lb = Label(frame,text="Введите вторую сторону (в см)  ",)
   stor_two_lb.grid(row=4, column=1)
   two = Entry(frame,)
   two.grid(row=4, column=2, pady=5)
   cal_btn = Button(frame, text='Рассчитать периметр',command=calculate_per)
   cal_btn.grid(row=5, column=2)
   return [one, two]
   window.mainloop()
def calculate_per1():
   n = int(rte.get())
   m = int(dre.get())
   per = (n+m)*2 
   messagebox.showinfo('Результат', f'Периметр прямоугольника= {per}')
def pr():
   window=Toplevel()
   window.title("Считаем периметр квадрата")
   window.geometry('500x200')
   frame=Frame(window,padx = 10,pady = 10)
   frame.pack(expand=True)
   rte=Label(frame,text="Введите первую сторону (в см)  ")
   rte.grid(row=3, column=1)
   rte1=Entry(frame,)
   rte1.grid(row=3, column=2)
   dre=Label(frame,text="Введите вторую сторону (в см)  ",)
   dre.grid(row=4, column=1)
   dre1=Entry(frame,)
   dre1.grid(row=4, column=2, pady=5)
   cal_btn=Button(frame, text='Рассчитать периметр',command=calculate_per1)
   cal_btn.grid(row=5, column=2)
   window.mainloop()
def calculate_per2():
   n = int(stor_one_lb.get())
   m = int(stor_two_lb.get())
   p = int(stor_thre_lb.get())
   per = n+m+p 
   messagebox.showinfo('Результат', f'Периметр треугольник= {per}')
def tr():
   window=Toplevel()
   window.title("Считаем периметр квадрата")
   window.geometry('500x200')
   frame = Frame(window,padx = 10,pady = 10)
   frame.pack(expand=True)
   stor_one_lb = Label(frame,text="Введите первую сторону (в см)  ")
   stor_one_lb.grid(row=3, column=1)
   stor_one_tf = Entry(frame,)
   stor_one_tf.grid(row=3, column=2)
   stor_two_lb = Label(frame,text="Введите вторую сторону (в см)  ",)
   stor_two_lb.grid(row=4, column=1)
   stor_two_tf = Entry(frame,)
   stor_two_tf.grid(row=4, column=2, pady=5)
   stor_thre_lb = Label(frame,text="Введите третью сторону (в см)  ",)
   stor_thre_lb.grid(row=5, column=1)
   stor_thre_tf = Entry(frame,)
   stor_thre_tf.grid(row=5, column=2, pady=6)
   cal_btn = Button(frame, text='Рассчитать периметр',command=calculate_per2)
   cal_btn.grid(row=6, column=2)
   window.mainloop()          
window = Tk()
window.title("Считаем периметр фигур")
window.geometry('500x200')
frame = Frame(window,padx = 10,pady = 10)
frame.pack(expand=True)
cal_btn = Button(frame, text='Квадрат',command=kv)
cal_btn.grid(row=5, column=2)
cal_btn = Button(frame, text='Прямоугольник',command=pr)
cal_btn.grid(row=10, column=2)
cal_btn = Button(frame, text='Треугольник',command=tr)
cal_btn.grid(row=15, column=2)
window.mainloop()

Ответы

▲ 0Принят

Самое простое решение в данном случае, которое я тут вижу - внести вычисляющие функции в те функции, где находятся переменные, к которым они обращаются, тогда они будут видеть эти переменные:

from tkinter import *
from tkinter import messagebox


def kv():
    window=Toplevel()
    window.title("Считаем периметр квадрата")
    window.geometry('500x200')
    frame = Frame(window,padx = 10,pady = 10)
    frame.pack(expand=True)
    stor_one_lb = Label(frame,text="Введите первую сторону (в см)  ")
    stor_one_lb.grid(row=3, column=1)
    one = Entry(frame,)
    one.grid(row=3, column=2)
    stor_two_lb = Label(frame,text="Введите вторую сторону (в см)  ",)
    stor_two_lb.grid(row=4, column=1)
    two = Entry(frame,)
    two.grid(row=4, column=2, pady=5)

    def calculate_per():
        n = int(one.get())
        m = int(two.get())
        per = (n+m)*2 
        messagebox.showinfo('Результат', f'Периметр квадрата= {per}')

    cal_btn = Button(frame, text='Рассчитать периметр',command=calculate_per)
    cal_btn.grid(row=5, column=2)


def pr():
    window=Toplevel()
    window.title("Считаем периметр квадрата")
    window.geometry('500x200')
    frame=Frame(window,padx = 10,pady = 10)
    frame.pack(expand=True)
    rte=Label(frame,text="Введите первую сторону (в см)  ")
    rte.grid(row=3, column=1)
    rte1=Entry(frame,)
    rte1.grid(row=3, column=2)
    dre=Label(frame,text="Введите вторую сторону (в см)  ",)
    dre.grid(row=4, column=1)
    dre1=Entry(frame,)
    dre1.grid(row=4, column=2, pady=5)

    def calculate_per1():
        n = int(rte1.get())
        m = int(dre1.get())
        per = (n+m)*2 
        messagebox.showinfo('Результат', f'Периметр прямоугольника= {per}')

    cal_btn=Button(frame, text='Рассчитать периметр',command=calculate_per1)
    cal_btn.grid(row=5, column=2)


def tr():
    window=Toplevel()
    window.title("Считаем периметр квадрата")
    window.geometry('500x200')
    frame = Frame(window,padx = 10,pady = 10)
    frame.pack(expand=True)
    stor_one_lb = Label(frame,text="Введите первую сторону (в см)  ")
    stor_one_lb.grid(row=3, column=1)
    stor_one_tf = Entry(frame,)
    stor_one_tf.grid(row=3, column=2)
    stor_two_lb = Label(frame,text="Введите вторую сторону (в см)  ",)
    stor_two_lb.grid(row=4, column=1)
    stor_two_tf = Entry(frame,)
    stor_two_tf.grid(row=4, column=2, pady=5)
    stor_thre_lb = Label(frame,text="Введите третью сторону (в см)  ",)
    stor_thre_lb.grid(row=5, column=1)
    stor_thre_tf = Entry(frame,)
    stor_thre_tf.grid(row=5, column=2, pady=6)

    def calculate_per2():
        n = int(stor_one_tf.get())
        m = int(stor_two_tf.get())
        p = int(stor_thre_tf.get())
        per = n+m+p 
        messagebox.showinfo('Результат', f'Периметр треугольник= {per}')

    cal_btn = Button(frame, text='Рассчитать периметр',command=calculate_per2)
    cal_btn.grid(row=6, column=2)


window = Tk()
window.title("Считаем периметр фигур")
window.geometry('500x200')
frame = Frame(window,padx = 10,pady = 10)
frame.pack(expand=True)
cal_btn = Button(frame, text='Квадрат',command=kv)
cal_btn.grid(row=5, column=2)
cal_btn = Button(frame, text='Прямоугольник',command=pr)
cal_btn.grid(row=10, column=2)
cal_btn = Button(frame, text='Треугольник',command=tr)
cal_btn.grid(row=15, column=2)
window.mainloop()
▲ 1

Добавим функцию, которая будет делать нужные вычисления и закрывать окно с приемом параметров. Остальные по аналогии

def calc(func: callable, args: tuple, wnd: Frame):
   func(*args)
   wnd.destroy()


def perimetr_kv(one: Entry):
   n = int(one.get())
   per = 4*n
   messagebox.showinfo('Результат', f'Периметр квадрата= {per}')


def kv():
   top=Toplevel()
   top.title("Считаем периметр квадрата")
   top.geometry('500x200')
   frame = Frame(top,padx = 10,pady = 10)
   frame.pack(expand=True)
   stor_one_lb = Label(frame,text="Введите сторону (в см)  ")
   stor_one_lb.grid(row=3, column=1)
   one = Entry(frame,)
   one.grid(row=3, column=2)
   cal_btn = Button(frame, text='Рассчитать периметр',command=lambda: calc(calculate_per, (one,), top))
   cal_btn.grid(row=5, column=2)