как постоянно отображать случайные числа tkinter

#python #tkinter

#python #tkinter

Вопрос:

Как отображать случайные числа в canvas, чтобы число постоянно менялось.

 from tkinter import *
from random import randrange
from tkinter.font import *
root=Tk()
root.geometry("600x300")
while True:
    var=randrange(0,10)
    var =60
cv = Canvas(root,width=200,height=200,bg="blue")
styles = Font(family="calibri",size=30,weight="bold")
cv.create_text(100,100,text="Number: " str(var),font=styles,fill="lightblue")
cv.pack(side=RIGHT)
root.mainloop()
  

Я хочу, чтобы эффект случайных чисел присутствовал не в этом коде, а в tkinter canvas

 from random import randrange
from time import sleep
from os import system

while True:
    system("cls")
    rand = randrange(10)
    rand =60
    print("Random number: ",rand)
    sleep(1)
  

Ответ №1:

Взгляните на этот пример, в котором используются randint и after() .

 from tkinter import *
import random
#from tkinter.font import *

root = Tk()
root.geometry("600x300")


def repeat():
    global timer
    rand = random.randint(1, 100)
    # configuring the tag, to overcome over writing of text.
    cv.itemconfigure('rand', text="Number: " str(rand))
    # asking to repeat it, you can change the interval.
    timer = root.after(1000, repeat)

def stop():
    root.after_cancel(timer)

cv = Canvas(root, width=200, height=200, bg="blue")
#styles = Font(family="calibri",size=30,weight="bold")
cv.create_text(100, 100, font=("calibri", 20, "bold"),
               fill="lightblue", tag='rand')  # added a tag
cv.pack()

b_start = Button(root, text='Start', command=repeat,width=10)
b_start.pack(pady=10)

b_stop = Button(root, text='Stop', command=stop,width=10)
b_stop.pack(padx=10)

root.mainloop()
  

Изменения:

  • Цикл while может привести к тому, что окно перестанет отвечать, поэтому я использовал здесь after() метод для постоянного повторения функции, если у вас есть какие-либо планы по отмене after() вызовов, дайте мне знать. Вы можете регулировать время между каждым вызовом, регулируя ms .

  • Здесь я также использовал randint вместо randrange() надеюсь, что он служит той же цели и для этой цели.

  • А также я удалил импорт tkinter.font поскольку нет необходимости импортировать модуль и можно указать шрифты в кортеже, например ("calibri",30,"bold")

Почему использовать after() а не while нет?

Это связано с тем, что while цикл может мешать работе tkinter mainloop() , в результате чего окно иногда перестает отвечать, поэтому не рекомендуется использовать while или time.sleep() . Вместо этого вы могли бы использовать встроенный after() метод tkinter или threading тоже.

Вот еще немного о after() :

  • Он принимает два позиционных аргумента, в основном, ms и func
  • ms — Это время (в миллисекундах), по истечении которого будет запущена указанная функция.
  • func — Это функция, которая будет запущена после указанного ms завершения.

Надеюсь, это развеет ваши сомнения, дайте мне знать, если возникнут какие-либо ошибки.

Приветствия

Комментарии:

1. @Maria и если вы планируете закончить after() , дайте мне знать.

2. Я бы сделал с кнопкой «Пуск», я думаю, это будет похоже на состояние false и True

3. И кнопки paue и stop

4. @Maria Это выглядит круто! Вы не возражаете против удаления изображения, потому что не рекомендуется обновлять вопросы полученными ответами или изображением.

5. @Maria Всего наилучшего 🙂