на Tkinter не может создать несколько кнопок с разными аргументами в цикле - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь сделать много кнопок на моем экране с помощью l oop. Я использую лямбду для вызова моей функции с аргументами. Но я не могу дать разные аргументы для каждой кнопки. Так что мне нужно знать, почему это происходит , Какое решение для этого. Использует ли tkinter одинаковый кэш-память для этих кнопок? Если это так, я пытался дать разные имена с другим списком для этих кнопок, но проблема была та же. Спасибо, что уже ответили ..

from tkinter import *
def printmyvalue(value):
    print(value)
app = Tk()
test_list = []
for i in range(10):
    test_list.append(Button(app,text=str(i+1),command=lambda : printmyvalue(i)))
    test_list[i].grid(row=i)
app.mainloop()

1 Ответ

1 голос
/ 15 апреля 2020

Эта проблема была много раз - поэтому вы могли ее найти.

command=lambda args=i:printmyvalue(args)

В вашей версии lambda:printmyvalue(i) не копирует значение из i в функцию lambda, но сохраняет ссылку на память, используемая переменной i. Таким образом, все кнопки имеют одинаковые ссылки на одну и ту же память. Когда вы нажимаете кнопку, она получает значение из этой памяти, но в этой памяти находится последнее значение, используемое в l oop, поэтому все кнопки используют последнее значение.

Используя lambda args=i:, он создает новую переменную args в каждом lamba и копирует значение из i в args - so every lambda` использует другую переменную с другим значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...