Как передать в функцию информацию с виджетов?
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()
