@va1166

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

Что нужно изменить в коде, чтобы в элементе tkinter (в конкретном случае — холст) происходил вывод промежуточного результата (то, что выводит функция print("x=",x) в коде ниже. Спасибо за ответы, ничего не могу придумать самостоятельно((
from tkinter import *
from random import *

def calc(event):
    x = 0 
    while x != 5:
        x = randrange (1,10,1)
        print("x=",x)
        canv.delete("canvtext")
        canv.create_text(50, 50, font=("Verdana", 20), text=str(x), anchor=CENTER, tags=('canvtext')) 

root = Tk()
root.geometry('640x480+400+90')
but = Button(root, text='Рассчитать', width=10, height=3, font=("arial", 12))

canv = Canvas(root, bg="lightgray", height=100, width=100, highlightthickness=0)
canv.create_text(50, 50, font=("arial", 20), text=str(0), anchor=CENTER, tags=('canvtext')) 

but.pack()
canv.pack()
but.bind("<Button-1>", calc)
 
root.mainloop()
  • Вопрос задан
  • 249 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
В большинстве случаев, когда изменяешь элемент управления, он не перерисовывает себя немедленно - он только принимает к сведению, что ему нужно будет перерисовать себя при первой возможности. А первая возможность ему представится, когда твой обработчик calc() закончит работу.

Поэтому есть пара вариантов.
1. вызывать внутри цикла в calc() root.update_idletasks(). Это приостановит твой обработчик и даст шанс элементам управления отрисоваться, а потом возобновит выполнение.
2. Разбить обработчик на отдельные короткие (это важно!) итерации. В конце каждой итерации планировать выполнение следующей с помощью root.after(), если требуется. Тогда в промежутках между завершением текущей итерации и вызовом запланированной следующей ткинтер будет успевать отрисовываться.

В обоих случаех следует предусмотреть/проверить, что будет если нажать на кнопку дважды. Я подозреваю, ничего хорошего, так что кнопку стоит отключить на время выполнения обработчика.
Ответ написан
Ваш ответ на вопрос

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

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