Python Tkinter Как обновить текстовый виджет в цикле for? - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь обновить текст в виджете scrolltext внутри цикла for. Оператор print показывает обновленный текст каждый раз в цикле, но я ничего не вижу в окне Tk, пока цикл не завершится. Затем я вижу '(' Это ', 4,' раз, когда цикл. ')'. Я никогда не вижу, чтобы отображались цифры от 0 до 3.

from   tkinter import *
from   tkinter import scrolledtext
import time

main = Tk()
main.title("test_loop")
main.geometry('750x625')
main.configure(background='ivory3')


def show_msg():
    global texw
    textw = scrolledtext.ScrolledText(main,width=40,height=25)
    textw.grid(column=0, row=1,sticky=N+S+E+W)
    textw.config(background="light grey", foreground="black",
             font='arial 20 bold', wrap='word', relief="sunken", bd=5)
    for i in range(5):
        txt = "This is ", i, " times though the loop."
        txt = str(txt)
        print(txt)
        textw.delete('1.0', END)  # Delete any old text on the screen
        textw.update()            # Clear the screen.
        textw.insert(END, txt)    # Write the new data to the screen
        time.sleep(5)

btn = Button(main, text = 'display_log', bg='light grey', width = 15, 
         font='arial 12', relief="raised",bd=5,command = show_msg)
btn = btn.grid(row = 0, column = 0)

main.mainloop()

Ответы [ 3 ]

1 голос
/ 18 октября 2019

Сначала давайте очистим код, чтобы он был более дружественным к PEP8, а также изменим импорт, чтобы мы не импортировали *. Импортируя *, вы рискуете перезаписать импорт и встроенные методы.

Я бы создал ваш виджет вне вашей функции, а затем заменил бы ваш цикл, содержащий sleep(), на функцию, которая может вызывать себя и использоватьafter(), так как режим сна блокирует ваш основной цикл, делая ваш GUI бесполезным и замороженным, пока весь сон не будет завершенafter() используется, чтобы избежать этой проблемы.

import tkinter as tk
from tkinter import scrolledtext

root = tk.Tk()
root.title('test_loop')
root.geometry('750x625')
root.configure(background='ivory3')
textw = scrolledtext.ScrolledText(root, width=40, height=25)
textw.grid(column=0, row=1, sticky='nsew')
textw.config(background='light grey', foreground='black', font='arial 20 bold', wrap='word', relief='sunken', bd=5)


def show_msg(count=None):
    if count is not None:
        if count <= 5:
            txt = 'This is {} times though the loop.'.format(count)
            textw.delete('1.0', 'end')
            textw.insert('end', txt)
            count += 1
            root.after(2000, lambda: show_msg(count))
    else:
        show_msg(1)


tk.Button(root, text='display_log', bg='light grey', width=15, font='arial 12', relief='raised', bd=5,
          command=show_msg).grid(row=0, column=0)

root.mainloop()

Результаты:

enter image description here

Если вы хотите сохранить все свои журналына экране (при условии, что вы хотите, чтобы все обычные журналы были сохранены), я удалил бы команду удаления и затем добавил \n к тексту, чтобы каждый журнал находился в новой строке.

Просто отредактируйтефункция как это:

def show_msg(count=None):
    if count is not None:
        if count <= 5:
            txt = 'This is {} times though the loop.\n'.format(count)
            # textw.delete('1.0', 'end')
            textw.insert('end', txt)
            count += 1
            root.after(2000, lambda: show_msg(count))
    else:
        show_msg(1)

Результаты:

enter image description here

Дайте мне знать, если у вас есть какие-либо вопросы.

0 голосов
/ 18 октября 2019

Вы спите после вставки текста, а затем удаляете текст до следующего вызова update. Вызов update должен произойти после вставки текста, а не до.

0 голосов
/ 18 октября 2019

Проблема в том, что ваше окно не обновляется, пока не будет запущен цикл. Чтобы избежать «освобождения», вы должны периодически обновлять его. Сделайте что-то вроде этого:

from tkinter import *
do_your_init()
tk = Tk()
do_your_preparation()
for x in range(n):
    do_your_update()
    tk.update()

Надеюсь, это полезно! Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...