Найти - Пользователи
Полная версия: вопрос по tkinter Radiobutton
Начало » GUI » вопрос по tkinter Radiobutton
1 2 3 4 5 6
4kpt
Проблема заключается в том, что функции находятся на одном уровне видимости. Следовательно, функция 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. Написать класс. Но это пока для Вас сложновато.
Ystritsa
я очень благодарна Вам за помощь!!! но проделав первый Ваш предложенный вариант и второй все равно питон к чемуто цепляется(
4kpt
Дайте код ошибки. Так понять сложно…
Ystritsa
update_user() takes exactly 3 arguments (1 given)
4kpt
Еще раз просмотрел Ваш код.
Уберите строчку
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() 
Проверяйте. Помогло?
Ystritsa
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)
4kpt
Вы эту строчку точно исправили?
def update_user(i, f, l):
Перепешите полностью новый код. Я его постепенно редактировал. У меня слетел язык и прошлось английские символы тупо копировать :)
Ystritsa
еще раз перепроверила и так же как у Вас в последней версии кода но теперь еще больше ошибок(хотя когда я експерементировала они бывало уже выскакивали)
4kpt
Сейчас прогоню Ваш код, но без обновления через сервер…
4kpt
Придется машину перезагрузить. Не работает английская раскладка. Долбаная семерка. Сейчас стану офлайн. Но через пару минут вернусь. Выложу рабочий код…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB