Использование текстовых виджетов tkinter для отображения результата - PullRequest
1 голос
/ 27 апреля 2019

Я стараюсь случайным образом выбрать 6 чисел в диапазоне и отобразить их с помощью виджета Text.

Предполагается, что программа пишет по одной строке каждую секунду, а вывод - только одна строка (последняя строка) ..

Код:

from tkinter import *
import random
import time

wn=Tk()
wn.geometry("300x300")

for i in range(5):
    loto=random.sample(range(1,30),6)
    mytext=Text(wn,bg="pink",width=30,height=200)
    mytext.pack()
    mytext.insert('1.0', loto,"\n")
    mytext = mytext.get('1.0', 'end')
    time.sleep(1)

wn.mainloop()

1 Ответ

2 голосов
/ 27 апреля 2019

Вы не можете использовать только time.sleep(1), чтобы видеть обновления каждую секунду, вы должны обновить главное окно.И вы создаете виджет размером 5 Text каждые 1 секунду, одного достаточно.Просто сделайте один вне цикла и обновите его.

Как-то так ..

from tkinter import*
import random, time

wn=Tk()
wn.geometry("300x300")

mytext=Text(wn,bg="pink",width=30,height=200)
mytext.pack()

for i in range(5):
    loto = random.sample( range(1,30),6)
    mytext.insert('end', str(loto) + '\n')
    wn.update()
    time.sleep(1)

wn.mainloop()

Хотя это не рекомендуемый способ зацикливания чего-то в tkinter, нодля маленьких петель и подобных целей это хорошо использовать.Если вы планируете зациклить что-то большое, например, обновить много текста, виджетов и изображений в tkinter, тогда используйте функцию after() ( Как использовать after ()? ).Вкратце after вызывает функцию в каждом заданном интервале, поэтому, помещая ее в функцию, она продолжает вызывать одну и ту же функцию до тех пор, пока вы не остановите ее, может быть остановлена ​​различными способами см. Этот пост о том, как остановить после .

С использованием after():

from tkinter import*
import random, time

wn=Tk()
wn.geometry("300x300")

mytext=Text(wn,bg="pink",width=30,height=200)
mytext.pack()

def update(c=0):
    if c < 5:                                   # Runs 5 times
        loto = random.sample( range(1,30),6)
        mytext.insert('end', str(loto) + '\n')
        wn.after(1000, update, c+1)             # after( ms, func, args )

update()                                        # Called the function once

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