Как «распечатать» логи консоли в Tkinter? - PullRequest
0 голосов
/ 07 августа 2020

Я читал несколько похожих вопросов, но не думаю, что они ответят на мой.

У меня есть базовый c код для подсчета до 10 после нажатия кнопки «запустить» в GUI:

from tkinter import *
from time import sleep

def count_to_10():
    for i in range(1,11):
        sleep(0.5)
        print(i)
        counter_label.after(0, counter_label.config(text=i))
    return

def GUI():
    root = Tk()

    run_button = Button(root, text="run", command=count_to_10)
    run_button.pack()

    global counter_label
    counter_label = Label(root, text="counter")
    counter_label.pack()

    root.mainloop()

GUI()

Я ожидаю, что текст counter_label будет изменяться с 1 до 10 после каждой итерации функции count_to_10. Метка изменяется при возврате функции, не во время выполнения.

Вывод консоли:

1
2
3
4
5
6
7
8
9
10

Изменение метки:

После завершения функции метка изменяется только один раз на 10.

Тот же результат применяется к другим виджетам, таким как scrolledtext, Text, и т. Д.

Как я могу изменить ярлык (или любой текстовый виджет) во время работы функции?

Спасибо за вашу помощь!

PS: Это похоже на то, что вывод консоли включен GUI.

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Вам не нужно использовать метод x.after(). Просто используйте метод config или configure. Например: counter_label.configure(text=i), тогда вы должны позволить root обновить главное окно этой строкой: root.update() (root должно быть глобальным или передаваться в качестве аргумента).

Полный код:

from tkinter import *
from time import sleep


def count_to_10():
    for i in range(1, 11):
        sleep(0.5)
        print(i)
        counter_label.configure(text=i)  # Update the text in "Label" widget.
        root.update()  # Let root update the main window.


def GUI():
    global root
    root = Tk()

    run_button = Button(root, text="run", command=count_to_10)
    run_button.pack()

    global counter_label
    counter_label = Label(root, text="counter")
    counter_label.pack()

    root.mainloop()


GUI()

GUI:

GUI

Вывод на консоль:

>>> python3 test.py 
1
2
3
4
5
6
7
8
9
10

Примечание:

Ярлык You изменялся только один раз (когда счетчик был 10), потому что root не удалось обновить, и он был обновлен, когда ваша функция count_to_10 вернулась (после for l oop), и, конечно же, последним числом было 10.

0 голосов
/ 07 августа 2020

Вы неправильно использовали after(). Также не используйте time.sleep() в приложении tkinter, так как это заблокирует tkinter mainl oop от обновления виджетов.

Измените count_to_10(), как показано ниже:

def count_to_10(n=1):
    counter_label.config(text=n)
    if n < 10:
        counter_label.after(500, count_to_10, n+1)
...