Форум сайта python.su
Проблема заключается в том, что функции находятся на одном уровне видимости. Следовательно, функция update ничего не знает о переменных функции new, так как эти переменные являются локальными и видимыми только внутри функции new. Решение этой проблемы можно представить в виде четырех альтернативных вариантов:
1. Явно передать ссылки на поля ввода с использованием анонимной функции lambda
but.bind("<Button-1>", lambda x: update_user(i, f, l))
def update_user(i, f, l):
def new(ev): def update_user(ev): "Тело функции update" "Тело функции new"
def new(ev): global i global f global l
Отредактировано 4kpt (Дек. 13, 2012 20:13:48)
Офлайн
я очень благодарна Вам за помощь!!! но проделав первый Ваш предложенный вариант и второй все равно питон к чемуто цепляется(
Офлайн
Дайте код ошибки. Так понять сложно…
Офлайн
update_user() takes exactly 3 arguments (1 given)
Офлайн
Еще раз просмотрел Ваш код.
Уберите строчку
update_user(i.get(),f.get(),l.get()).
def update_user(i, f, l): i_ = i.get() f_ = f.get() l_ = l.get() mdl = MDL() print mdl.conn_xmlrpc(server) users = [{ 'id': i_, #'username': 'username3', #'password': 'password3', 'firstname': f_, 'lastname': l_, #'email': 'email3@domain.com', }] print mdl.update_users(server, users) def new(ev): win2 = Toplevel() win2.title("Ввод данных") lbl1 = Label(win2, text = u"Введите id пользователя") lbl1.grid(row=1,column=0,columnspan=2) lbl2 = Label(win2, text = u"Введите имя пользователя") lbl2.grid(row=2,column=0,columnspan=2) lbl3 = Label(win2, text = u"Введите фамилию пользователя") lbl3.grid(row=3,column=0,columnspan=2) i = Entry(win2, width="20") f = Entry(win2, width="20") l = Entry(win2, width="20") i.grid(row=1,column=2,columnspan=2) f.grid(row=2,column=2,columnspan=2) l.grid(row=3,column=2,columnspan=2) but=Button(win2,text="Выполнить", width=18, height=2,) but.grid(row=4,column=2,ipadx=5,padx=10,pady=5) but.bind("<Button-1>", lambda x: update_user(i, f, l)) win2.mainloop()
Отредактировано 4kpt (Дек. 14, 2012 02:32:39)
Офлайн
Exception in Tkinter callback
Traceback (most recent call last):
File “C:\Python27\lib\lib-tk\Tkinter.py”, line 1410, in __call__
return self.func(*args)
File “C:\Python27\777777.py”, line 91, in <lambda>
but.bind(“<Button-1>”, lambda x: update_user(i, f, l))
TypeError: update_user() takes exactly 1 argument (3 given)
Офлайн
Вы эту строчку точно исправили?
def update_user(i, f, l):
Отредактировано 4kpt (Дек. 14, 2012 02:34:23)
Офлайн
еще раз перепроверила и так же как у Вас в последней версии кода но теперь еще больше ошибок(хотя когда я експерементировала они бывало уже выскакивали)
Офлайн
Сейчас прогоню Ваш код, но без обновления через сервер…
Офлайн
Придется машину перезагрузить. Не работает английская раскладка. Долбаная семерка. Сейчас стану офлайн. Но через пару минут вернусь. Выложу рабочий код…
Офлайн