@Noob12323

Как в tkinter задать последовательность команд при нажатии на кнопку?

Всем привет! Мне нужно, чтобы при нажатии на кнопку через Tkinter происходило последовательное изменение одного и того же объекта с некоторыми паузами (в примере нужно, чтобы в окне при нажатии постепенно добавлялось многоточие у label). Подход в лоб не сработал, при нажатии сначала обрабатывается вся очередность действий, а потом сразу появляется итоговый текст:
from tkinter import *
from time import *
w = Tk()

def click():
    a=0
    while a < 1:
        lbl.configure(text = 'Ожидание')
        sleep(0.3)
        lbl.configure(text='Ожидание.')
        sleep(0.3)
        lbl.configure(text='Ожидание..')
        sleep(0.3)
        lbl.configure(text='Ожидание...')
        sleep(0.3)
        a += 0.5

lbl = Label(text = '')
lbl.pack()

btn = Button(text='Жмяк', command= click)
btn.pack()

w.mainloop()


Попытка вывести цикл из функции с помощью глобальной переменной тоже ни к чему не приводит:
from tkinter import *
from time import *
w = Tk()

a=1
def click():
    global a
    a=0

while a < 1:
    lbl.configure(text = 'Ожидание')
    sleep(0.3)
    lbl.configure(text='Ожидание.')
    sleep(0.3)
    lbl.configure(text='Ожидание..')
    sleep(0.3)
    lbl.configure(text='Ожидание...')
    sleep(0.3)
    a += 0.5

lbl = Label(text = '')
lbl.pack()

btn = Button(text='Жмяк', command= click)
btn.pack()

w.mainloop()


Причем помимо текста потом хочу добавить картинку, работающую по тому же триггеру и сменяющуюся по такому же принципу
  • Вопрос задан
  • 131 просмотр
Пригласить эксперта
Ответы на вопрос 1
SuckMyPython
@SuckMyPython
matrix.polling(none_stop=True)
Don't use time.sleep()
Use element.after(delay, do_smth)

from tkinter import *
from PIL import Image, ImageTk

w = Tk()

i=j=0

img1 = Image.open("1.png")
img2 = Image.open("2.png")
img3 = Image.open("3.png")

image1 = ImageTk.PhotoImage(img1)
image2 = ImageTk.PhotoImage(img2)
image3 = ImageTk.PhotoImage(img3)

img_list = [image1, image2, image3]
text_list = ['Ожидание','Ожидание.','Ожидание..','Ожидание...']

text_delay = 500    #Настройка задержки изменения текста
img_delay = 1000    #Настройка задержки изменения картинки

text_cicle = 3      #Настройка количества циклов изменения текста
img_cicle = 2       #Настройка количества циклов изменения картинок

def imgTV_end():
    print("akbar")
    lbl.configure(text = 'Опа!', image='')

def img_func():
    global i,j
    lbl.configure(image = img_list[i])
    print(i)
    print(j)
    i+=1
    if i>len(img_list)-1:
        i=0

    if j<len(img_list)*img_cicle:
        lbl.after(img_delay, img_func)

    j+=1
    if j>len(img_list)*img_cicle:
        j=0
        i=0
        imgTV_end()

def click():
    global i,j
    lbl.configure(text = text_list[i])

    i+=1
    if i>len(text_list)-1:
        i=0

    if j<len(text_list)*text_cicle:
        lbl.after(text_delay, click)

    j+=1
    if j>len(text_list)*text_cicle:
        j=0
        i=0
        img_func()

lbl = Label(text = '')
lbl.pack()

btn = Button(text='Жмяк', command=click)
btn.pack()

w.mainloop()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы