Не понимаю как применить обработчик событий в tkinter
Имеется код:
import tkinter as tk
def add_to_txt():
text_w.insert(1.0, ent.get())
win = tk.Tk()
win.geometry('500x600')
text_w = tk.Text(win, height=5, width=20)
text_w.grid(row=0, column=0, columnspan=2)
for i in range(4):
ent = tk.Entry(win)
ent.grid(row=1, column=0, pady=5)
btn = tk.Button(win, text='ok', bg='green', command=add_to_txt)
btn.grid(row=1, column=1, pady=5)
win.mainloop()
Необходимо чтобы он записал в виджет text_w то, что ввел пользователь в Entry по нажатию Button 4 раза.
Не понимаю как в этом случае использовать обработчик событий. Что необходимо использовать чтобы цикл for "ждал" нажатие кнопки, а не продолжал выполняться?
UPD
Немного изменил код, чтобы было более понятней:
import tkinter as tk
def add_n():
def add_to_txt(i):
s = f'i={i}, {ent.get()}\n'
t.insert(1.0, s)
ent.destroy()
btn.destroy()
n = int(ent1.get())
ent1.destroy()
btn1.destroy()
for i in range(n):
ent = tk.Entry(win)
ent.grid(row=1, column=0, pady=5)
btn = tk.Button(win, text='ok', bg='green', command=lambda: add_to_txt(i))
btn.grid(row=1, column=1, pady=5)
win = tk.Tk()
win.geometry('500x600')
t = tk.Text(win, height=5, width=20)
t.grid(row=0, column=0, columnspan=2)
ent1 = tk.Entry(win)
ent1.grid(row=1, column=0, pady=5)
btn1 = tk.Button(win, text='сколько повторений?', command=add_n)
btn1.grid(row=1, column=1, pady=5)
win.mainloop()
- Пользователь вводит количество повторений(n) и передает его в функцию add_n().
- Функция add_n() должна запросить у пользователя ввод строки в ent и по нажатию на кнопку btn вывести в поле Text строку в виде "i = 1, 12" и так n-раз
- Ну и после вывода n-ой строки в поле Text прекратить работу.
Проблема заключается в том, что цикл for, с помощью которого я хочу добиться ввода данных n-раз, не ждет очередного ввода строки и не прерывает выполнение итерации до нажатья на Button. Как это обойти мне не понятно.
Ответы (2 шт):
До старта win.mainloop() только создаются элементы, то есть в цикле создаются 4 Entry и 4 Button, из которых первые 3 "пропадают". Так что здесь цикл "лищний", все действия по нажатию кнопки надо выполнять в функции add_to_txt, можно 4 раза там и сделать.
Не уверен, что правильно понимаю то, что вы хотите сделать, но попробуйте так:
import tkinter as tk
n = 0
i = 1
def add_n():
global n, i
def add_to_txt():
global n, i
s = f'i={i}, n={n}, {ent.get()}\n'
t.insert(1.0, s)
ent.delete(0, last=77)
i += 1
n -= 1
if not n:
ent.destroy()
btn.destroy()
n = int(ent1.get())
ent1.destroy()
btn1.destroy()
ent = tk.Entry(win)
ent.grid(row=1, column=0, pady=5)
btn = tk.Button(win, text='ok', bg='green', command=add_to_txt)
btn.grid(row=1, column=1, pady=5)
ent.focus_set()
win = tk.Tk()
win.geometry('500x300')
t = tk.Text(win, height=5, width=20)
t.grid(row=0, column=0, columnspan=2)
ent1 = tk.Entry(win)
ent1.grid(row=1, column=0, pady=5)
btn1 = tk.Button(win, text='сколько повторений?', command=add_n)
btn1.grid(row=1, column=1, pady=5)
ent1.focus_set()
win.mainloop()



