Печать символов (с задержкой) на одном виджете несколько раз в Tkinter - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь печатать с задержкой (один символ появляется, проходит несколько миллисекунд, а затем появляется следующий) на одном и том же виджете несколько раз один за другим, что-то вроде> текст появляется с задержкой> второй проход> больше текста появляется с задержкой ... и тд. time.sleep () не работает, и я не знаю, как правильно использовать .after ()

Вот код, который я использую

from tkinter import *

def insert_slow(widget, string):
    if len(string) > 0:
        widget.insert(END, string[0])

    if len(string) > 1:
        widget.after(50, insert_slow, widget, string[1:])

root=Tk()

tx=Text(root)

tx.pack()
insert_slow(tx, "this is a testing piece of text\n")
tx.after(3000)
loop=insert_slow(tx, "this is another testing piece of text")

root.mainloop()

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Проблема с вашим кодом заключается в том, что after(3000) почти такой же, как time.sleep - он замораживает весь пользовательский интерфейс.

Решение довольно простое: используйте after для вызова вашего второгоinsert_slow.

insert_slow(tx, "this is a testing piece of text\n")
tx.after(3000, insert_slow, tx, "this is another testing piece of text")

Однако вы должны знать, что after относится ко времени, когда вы звоните after. Поскольку вторая строка кода в приведенном выше примере выполняется через миллисекунду после первой, второй вызов не произойдет через 3 секунды после появления первой строки, это произойдет через 3 секунды после того, как начнет появляться .

Если вы хотите подождать, пока закончится первый, и , то подождите три секунды, вам придется либо самостоятельно выполнить математику (добавьте 50 мс, умноженное на количество символов в началезначение), или добавить какой-то другой механизм. Вы можете передать несколько строк в insert_slow, и он может автоматически ждать три секунды между каждой строкой.

0 голосов
/ 10 ноября 2019

Ваш код выполняет оба текста параллельно, поэтому вы получите следующий вывод:

text1 = 'Hi to you'
text2 = 'Hi to me'

OUTPUT:
HHii  tt  oo  ymoeu

Ваш insert_slow ведет себя хорошо, но вам не нужно использовать after () снова, если вы попытаетесь запустить текст в двух отдельных строках.

И если так, то это должно быть в другом новом текстовом виджете.

Этот код работает, если вы хотите вывести текст на том же виджете:

from tkinter import *

def insert_slow(widget, string):
    if len(string) > 0:
        widget.insert(END, string[0])

    if len(string) > 1:
        widget.after(50, insert_slow, widget, string[1:])

root=Tk()

tx=Text(root)
tx.pack()

text_body = "this is a testing piece of text\n" \
            "this is another testing piece of text"



insert_slow(tx, text_body)

root.mainloop()

если вы хотите, чтобы текстовые строки вставлялись медленно, вы можете использовать это также:

from tkinter import *

def insert_slow(widget, string):
    if len(string) > 0:
        widget.insert(END, string[0])

    if len(string) > 1:
        widget.after(50, insert_slow, widget, string[1:])

root=Tk()

tx1=Text(root)
tx2=Text(root)
tx1.pack()
tx2.pack()

text_body1 = "this is a testing piece of text\n"
text_body2 = "this is another testing piece of text"



insert_slow(tx1, text_body1)
insert_slow(tx2, text_body2)

root.mainloop()
...