Форум сайта python.su
Ребят, привет. создаю игру. Там надо нажимать квадраты во время. Делаю не через pygame а через tkinter.Мне надо как то поставить таймер. То есть если ты нажал на кнопку не вовремя то проиграл. Надо что бы время показывалось на экране. И например: 0:03, 0:02, 0:01 И если я нажал вовремя то таймер возобновляется. Помогите, пожалуйста. Вот код:
from tkinter import * import random import time t = 3 a = 0 colors = ["blue", "red", "pink", "yellow", "orange", "green"] def Peremechenie(): global a global rnd a = a + 1 first = random.randint(100, 450) second = random.randint(100, 450) rnd = random.choice(colors) btn.place(height="70", width="70", x=first, y=second) btn.config(text=a, bg = rnd, fg = "black") root = Tk() root.title("Успей!") root.geometry("700x500") root.resizable(0,0) btn = Button(text=a, command= Peremechenie, bg = "black", fg = "white") lbl = Label(text="0:03") btn.place(height="70", width="70", x=300, y=200) root.mainloop()
Отредактировано utyara3 (Авг. 9, 2021 01:44:39)
Офлайн
самый простой способ это использовать root.after(). Имейте в виду, что заданный период в методе root.after() не гарантирован для вызова функции по истечении указаного периода, если приложение занято, в результате того, что Tkinter является однопоточным.
пример :
# from tkinter import * import random import time t = 3000 a = 0 colors = ["blue", "red", "pink", "yellow", "orange", "green"] start_time = 0 def timer_start(): global start_time start_time = time.perf_counter_ns() root.after(10, update_timer) def ms_to_time(ms): total_minuts = ms/1000 hours = int(total_minuts//60) minutes = round(total_minuts%60) return f'{hours}:{str(minutes).rjust(2, "0")}' def update_timer(): global t, start_time cur_time = time.perf_counter_ns() time_delta = (cur_time - start_time)// 1000000 #ms t = t - time_delta if t <= 0: root.destroy() start_time = cur_time lbl['text'] = ms_to_time(t) root.after(10, update_timer) def Peremechenie(): global a global rnd global t a = a + 1 t = t + 3000 first = random.randint(100, 450) second = random.randint(100, 450) rnd = random.choice(colors) btn.place(height="70", width="70", x=first, y=second) btn.config(text=a, bg = rnd, fg = "black") root = Tk() root.title("Успей!") root.geometry("700x500") root.resizable(0,0) btn = Button(text=a, command= Peremechenie, bg = "black", fg = "white") lbl = Label(text=ms_to_time(t)) lbl.pack() btn.place(height="70", width="70", x=300, y=200) root.after(10, timer_start) root.mainloop()
[code python][/code]
Отредактировано PEHDOM (Авг. 10, 2021 10:13:40)
Офлайн
PEHDOMЧел, спасибо, ты гений!
самый простой способ это использовать root.after(). Имейте в виду, что заданный период в методе root.after() не гарантирован для вызова функции по истечении указаного периода, если приложение занято, в результате того, что Tkinter является однопоточным.пример :
Офлайн