Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 19, 2012 03:14:13

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

Как можно обойтись без глобального определения переменной?

Как можно обойтись без глобального определения переменной?
В скрипте происходит вызов функции timer каждую минуту.
Если эту функцию сделать с аргументом. То возникает ошибка.

from tkinter import *
a=0
root=Tk()
def timer():
    global a
    a=a+1
    lab['text'] = a
    lab.after(1000, timer)
lab=Label(root, text=a)
lab.pack()
lab.after(1000, timer)
root.mainloop()

вот такой вариант не работает

from tkinter import *
a=1
root=Tk()
def timer(a):
    a=a+1
    lab['text'] = a
    lab.after(1000, timer(a))
lab=Label(root, text=a)
lab.pack()
lab.after(1000, timer(a))
root.mainloop()

Отредактировано 3dpython (Окт. 19, 2012 03:26:17)

Офлайн

#2 Окт. 19, 2012 03:32:14

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Как можно обойтись без глобального определения переменной?

lab.after(1000, lambda: timer(a))
Вариант не работает, потому что timer(a) возвращает не функцию и вызвать ее нельзя.

Офлайн

#3 Окт. 19, 2012 03:49:10

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

Как можно обойтись без глобального определения переменной?

Проверил с лямбдой, заработало. Я пока не понимаю почему. Я только начал учится программировать. Я так понимаю тут только вариант с лямбдой сработает?



Офлайн

#4 Окт. 19, 2012 04:36:11

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Как можно обойтись без глобального определения переменной?

3dpython
Я только начал учится пlambda: timer(a)рограммировать
Ну, если так:
lab.after(1000, lambda: timer(a))

Равносильно
def f():
    return timer(a)
lab.after(1000, f)

lambda: 1
=
def f():
    return 1

Офлайн

#5 Окт. 19, 2012 10:08:22

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Как можно обойтись без глобального определения переменной?

3dpython, алгоритм такой:
1. читаем официальную документацию;
2. гуглим;
3. смотрим исходники и примеры (если есть);
4. добиваемся результата методом тыка;
5. ищем схожие вопросы/ответы на этом форуме;
6. если всё ещй не получается – спрашиваем.

Порядок может быть иной, но это не касается первого и последнего пункта.

А вот нормальный вариант. Кстати, такой стиль задания callback'ов очень распространён. А lambda в Python – есть уродство, лучше про них забыть.

# ...
lab.after(1000, timer, a)
# ...
Глобальная переменная `a` после выполнения `timer` не изменится, это надо понимать.

..bw



Отредактировано bw (Окт. 19, 2012 10:11:58)

Офлайн

#6 Окт. 19, 2012 10:20:37

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как можно обойтись без глобального определения переменной?

bw
А lambda в Python – есть уродство, лучше про них забыть.
Херасе!!!



Офлайн

#7 Окт. 19, 2012 10:27:10

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Как можно обойтись без глобального определения переменной?

bw
А вот нормальный вариант. Кстати, такой стиль задания callback'ов очень распространён. А lambda в Python – есть уродство, лучше про них забыть.
На эту тему я тему создал.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version