Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 13, 2012 20:07:55

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

вопрос по tkinter Radiobutton

Проблема заключается в том, что функции находятся на одном уровне видимости. Следовательно, функция update ничего не знает о переменных функции new, так как эти переменные являются локальными и видимыми только внутри функции new. Решение этой проблемы можно представить в виде четырех альтернативных вариантов:

1. Явно передать ссылки на поля ввода с использованием анонимной функции lambda

but.bind("<Button-1>", lambda x: update_user(i, f, l))
При этом не забыть изменить функцию-приемник
def update_user(i, f, l):

2. Вложить функцию update в функцию new
def new(ev):
    def update_user(ev):
        "Тело функции update"
    "Тело функции new"
В этом случае будет выполнено правило LEGB и функция new станет для функции update - объемлюющей.

3. Использовать инструкцию global (Самый плохой вариант. Просто мега плох. Я настоятельно не рекомендую его использовать).
def new(ev):
    global i
    global f
    global l
Последний вариант переводит переменные i, f, l в глобальное пространство имен модуля. Это не есть хорошо, но как вариант, я не могу о нем не сказать…

4. Написать класс. Но это пока для Вас сложновато.



Отредактировано 4kpt (Дек. 13, 2012 20:13:48)

Офлайн

#2 Дек. 14, 2012 01:46:10

Ystritsa
Зарегистрирован: 2012-12-10
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по tkinter Radiobutton

я очень благодарна Вам за помощь!!! но проделав первый Ваш предложенный вариант и второй все равно питон к чемуто цепляется(

Офлайн

#3 Дек. 14, 2012 02:19:56

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

вопрос по tkinter Radiobutton

Дайте код ошибки. Так понять сложно…



Офлайн

#4 Дек. 14, 2012 02:26:05

Ystritsa
Зарегистрирован: 2012-12-10
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по tkinter Radiobutton

update_user() takes exactly 3 arguments (1 given)

Офлайн

#5 Дек. 14, 2012 02:26:53

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

вопрос по tkinter Radiobutton

Еще раз просмотрел Ваш код.
Уберите строчку

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)

Офлайн

#6 Дек. 14, 2012 02:32:35

Ystritsa
Зарегистрирован: 2012-12-10
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по tkinter Radiobutton

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)

Офлайн

#7 Дек. 14, 2012 02:33:18

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

вопрос по tkinter Radiobutton

Вы эту строчку точно исправили?

def update_user(i, f, l):
Перепешите полностью новый код. Я его постепенно редактировал. У меня слетел язык и прошлось английские символы тупо копировать :)



Отредактировано 4kpt (Дек. 14, 2012 02:34:23)

Офлайн

#8 Дек. 14, 2012 02:36:30

Ystritsa
Зарегистрирован: 2012-12-10
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по tkinter Radiobutton

еще раз перепроверила и так же как у Вас в последней версии кода но теперь еще больше ошибок(хотя когда я експерементировала они бывало уже выскакивали)

Офлайн

#9 Дек. 14, 2012 02:37:36

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

вопрос по tkinter Radiobutton

Сейчас прогоню Ваш код, но без обновления через сервер…



Офлайн

#10 Дек. 14, 2012 02:41:02

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

вопрос по tkinter Radiobutton

Придется машину перезагрузить. Не работает английская раскладка. Долбаная семерка. Сейчас стану офлайн. Но через пару минут вернусь. Выложу рабочий код…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version