#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 Всего наилучшего 🙂