Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 8, 2021 23:31:43

utyara3
Зарегистрирован: 2021-07-12
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Таймер в игре

Ребят, привет. создаю игру. Там надо нажимать квадраты во время. Делаю не через 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)

Офлайн

#2 Авг. 10, 2021 10:10:59

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Таймер в игре

самый простой способ это использовать 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)

Офлайн

#3 Авг. 14, 2021 00:56:22

utyara3
Зарегистрирован: 2021-07-12
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Таймер в игре

PEHDOM
самый простой способ это использовать root.after(). Имейте в виду, что заданный период в методе root.after() не гарантирован для вызова функции по истечении указаного периода, если приложение занято, в результате того, что Tkinter является однопоточным.пример :
Чел, спасибо, ты гений!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version