Как передать в функцию информацию с виджетов?

from tkinter import *
destroy_obj = []
def Destroy_object():
    for x in destroy_obj:
        x.destroy()
def Save_worker(event):
    print (name_addw.get() , salary_addw.get() ) 
def Add_worker():
    Destroy_object()
    name1_addw = Label (text = "Name")
    salary1_addw = Label (text = "Salary")
    name_addw = Entry()
    salary_addw = Entry()
    add_addw = Button (text = "ADD WORKER")
    add_addw.bind ("<Button-1>" , Save_worker)
    name_addw.grid(row = 0, column = 1)
    salary_addw.grid(row = 1 , column = 1)
    name1_addw.grid(row = 0 , column = 0)
    salary1_addw.grid(row = 1 , column = 0)
    add_addw.grid(row = 2, column = 0 )
    destroy_obj.append(add_addw)
    destroy_obj.append(name1_addw)
    destroy_obj.append(salary1_addw)
    destroy_obj.append(name_addw)
    destroy_obj.append(salary_addw)

root= Tk()
filemenu = Menu(root)
root.config(menu=filemenu)
filemenu.add_command(label = "Add worker" , command = Add_worker)
filemenu.add_command(label = "Worker list")
filemenu.add_command(label = "Schedule")
root.mainloop()

При запуске программы и попытке запустить функцию Save_worker() , пишет следующее :

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Programs\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "C:\Python\manager\Main.py", line 7, in Save_worker
    print (name_addw.get() , salary_addw.get() )
NameError: name 'name_addw' is not defined


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

Автор решения: S. Nick

С помощью метода bind() между собой связываются виджет, событие и действие.

Например:

  • виджет – кнопка (add_addw),
  • событие – клик по ней левой кнопкой мыши (event),
  • действие – отправка сообщения (функция-обработчик, Save_worker).

Вам надо передать дополнительные данные в метод bind(). Это можно сделать используя так называемые анонимные объекты-функции Python, которые создаются инструкцией lambda.

Попробуйте так:

from tkinter import *


destroy_obj = []

def Destroy_object():
    for x in destroy_obj:
        x.destroy()
        
def Save_worker(event, name_addw, salary_addw):           # + , name_addw, salary_addw
    print (name_addw.get(), salary_addw.get() ) 
    
def Add_worker():
    Destroy_object()
    name1_addw = Label (text = "Name")
    salary1_addw = Label (text = "Salary")
    name_addw = Entry()
    salary_addw = Entry()
    add_addw = Button (text = "ADD WORKER")
    
    add_addw.bind (
        "<Button-1>", 
        lambda btn, n_a=name_addw, s_a=salary_addw: Save_worker(btn, n_a, s_a)    # +++
    )
    
    name_addw.grid(row = 0, column = 1)
    salary_addw.grid(row = 1 , column = 1)
    name1_addw.grid(row = 0 , column = 0)
    salary1_addw.grid(row = 1 , column = 0)
    add_addw.grid(row = 2, column = 0 )
    destroy_obj.append(add_addw)
    destroy_obj.append(name1_addw)
    destroy_obj.append(salary1_addw)
    destroy_obj.append(name_addw)
    destroy_obj.append(salary_addw)


root= Tk()
filemenu = Menu(root)
root.config(menu=filemenu)
filemenu.add_command(label = "Add worker" , command = Add_worker)
filemenu.add_command(label = "Worker list")
filemenu.add_command(label = "Schedule")
root.mainloop()

введите сюда описание изображения

→ Ссылка