Подскажите, я пытаюсь создать простую тестовую программу в 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()