@HE_TYPOY

Проблема с customtkinter, параметр command у кнопки и цикл for. Как исправить?

Есть 2 цикла: в одном выводяться label`ы с text=i, и там все нормально(цифра увеличиваеться сверху вниз), но во втором - кнопки с text=i(тут тоже все норм) и command=lambda:print(i) при нажатии на любую кнопку, выводиться в консоль 19(по идее 19 должно выводиться только у последней кнопки). В чём проблема? Код ->

import customtkinter
app =customtkinter.CTk()
app.geometry("500x800")
app.resizable(False,False)
customtkinter.set_appearance_mode("dark")
container = customtkinter.CTkScrollableFrame(app,width=400,height=600)
container.place(relx=0.5,rely=0.5,anchor=customtkinter.CENTER)
def labels():
    for i in range(1,20):
        test = customtkinter.CTkLabel(container,text=i)
        test.pack(pady=10)
def buttons():
    for i in range(1,20):
        test = customtkinter.CTkButton(container,text=i,command=lambda :print(i))
        test.pack(pady=10)
buttons() # или lables

app.mainloop()
  • Вопрос задан
  • 40 просмотров
Решения вопроса 2
Vindicar
@Vindicar
RTFM!
Ну классика же, lambda завязывается на саму переменную, а не на её текущее значение. Т.е. если ты изменишь i, то все лямбды это увидят.
i = 10
f = lambda: print(i)
i = 20
f()  # выведет 20

Нужно сохранить искомое значение в самой лямбде. Самый простой способ - вот такой хак:
i = 10
# сохраняем глобальную i как значение по умолчанию параметра i
f = lambda i=i: print(i)  
i = 20
f()  # выведет 10
f(30)  # выведет 30

Как видишь последний вызов работает немножко не так, как мы ожидаем - а ожидаем мы ошибку из-за лишнего параметра. Но можно схитрить так:
i = 10
# сохраняем глобальную i как значение по умолчанию параметра i
# Параметр i может быть передан только по имени: i=30
f = lambda *,i=i: print(i)  
i = 20
f()  # выведет 10
f(i=30)  # выведет 30
f(30)  # TypeError: <lambda>() takes 0 positional arguments but 1 was given
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы