Не понимаю как применить обработчик событий в tkinter

Рейтинг: 1Ответов: 2Опубликовано: 27.01.2023

Имеется код:

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()
  1. Пользователь вводит количество повторений(n) и передает его в функцию add_n().
  2. Функция add_n() должна запросить у пользователя ввод строки в ent и по нажатию на кнопку btn вывести в поле Text строку в виде "i = 1, 12" и так n-раз
  3. Ну и после вывода n-ой строки в поле Text прекратить работу.

Проблема заключается в том, что цикл for, с помощью которого я хочу добиться ввода данных n-раз, не ждет очередного ввода строки и не прерывает выполнение итерации до нажатья на Button. Как это обойти мне не понятно.

Ответы

▲ 1Принят

Не уверен, что правильно понимаю то, что вы хотите сделать, но попробуйте так:

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()

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

▲ 0

До старта win.mainloop() только создаются элементы, то есть в цикле создаются 4 Entry и 4 Button, из которых первые 3 "пропадают". Так что здесь цикл "лищний", все действия по нажатию кнопки надо выполнять в функции add_to_txt, можно 4 раза там и сделать.