Подскажите, я пытаюсь создать простую тестовую программу в Tkinter Python с номерами билетов. Что не так?

В Tkinter на форме есть кнопки созданные через цикл for. При нажатии на любую создается дочернее окно с Entry в котором должно отобразиться имя кнопки. Но всегда отображается имя последней. Кнопок может быть много.

from tkinter import *
from tkinter import ttk
    
root = Tk()
root.geometry("200x200")

position1 = {
    "padx": 6,
    "pady": 6, 
    "anchor": NW
}
col = ["1", "2", "3"]
header = ttk.Label(text="Выберите ")
header.pack()
name = "0"
    
def select():
    window = Tk()
    window.title("Новое окно")
    window.geometry("250x200")
    ent = Entry(window)
    ent.insert(0, btn["text"])
    ent.pack()
    
for name in col:
    btn = ttk.Button(root, text=name, command=select)
    btn.pack(**position1)

root.mainloop()

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Все кнопки вызывают одну и ту же процедуру select. Она всегда выполняет одно и то же действие.

Выучите что такое замыкание. В данном примере makeSelect возвращает разные экземпляры select (это называется замыкания), которые отличаются переменной name. Теперь разные кнопки вызывают разные функции, которые делают разные вещи, как вы и хотели.

from tkinter import *
from tkinter import ttk
    
root = Tk()
root.geometry("200x200")

position1 = {
    "padx": 6,
    "pady": 6, 
    "anchor": NW
}
col = ["1", "2", "3"]
header = ttk.Label(text="Выберите ")
header.pack()


def makeSelect(name):
    
    def select():
        window = Tk()
        window.title("Новое окно")
        window.geometry("250x200")
        ent = Entry(window)
        ent.insert(0, name)
        ent.pack()

    return select
    

for name in col:
    btn = ttk.Button(root, text=name, command=makeSelect(name))
    btn.pack(**position1)

root.mainloop()
→ Ссылка