Как сделать так, чтобы таймер отображал секунды? - PullRequest
0 голосов
/ 07 февраля 2020

Я прочитал, что таймер обратного отсчета можно сделать с помощью time.sleep (). Это моя попытка. Я могу распечатать секунды в режиме ожидания, но не в окне Tkinter. Есть ли взломать вокруг этого?

import time; from tkinter import *

sec = 11
def start(timer):
    print(countDown(sec,timer))

def countDown(sec,timer):
    while sec >= 0:
        print(sec)
        if sec > 9:
            timer.configure(text = str(sec)) #'two digits'
        elif sec > 0:
            timer.configure(text = '0'+str(sec)) #'one digit'
        else:
            timer.configure(text = 'GAME OVER!')
        sec -= 1
        time.sleep(1)

win = Tk()
win.configure(bg='black')
header = Label(win, text="Game Timer", fg='blue', bg='black', font=('Arial Bold',14))
header.pack()
timer = Label(win, relief=SUNKEN, fg='white', bg='black', font=('Arial',14))
timer.pack(fill=BOTH, expand=1)
btn = Button(win,text='Start', command= lambda: start(timer))
btn.pack()
win.mainloop()

1 Ответ

1 голос
/ 07 февраля 2020

Итак, несколько вещей, которые мы можем сделать, чтобы улучшить это.

  1. Вместо того, чтобы пытаться управлять форматом с помощью оператора if, мы можем использовать strftime для форматирования времени. Это можно сделать, скажем, в Днях, Часах, Минутах, Се c и т. Д., Но сейчас нам просто нужны секунды.

  2. Вы хотите избежать while и sleep() пока в той же теме что и ткинтер. Это связано с тем, что эти 2 метода заблокируют основной l oop, поэтому вы никогда не увидите отображаемое время и когда-либо увидите GAME OVER только один раз, пока l oop и сон завершен, поскольку оба они блокируют основной l oop.

  3. Напишите свой импорт на новых строках и используйте import tkinter as tk вместо *. Это поможет предотвратить перезапись.

  4. мы можем удалить одну из ваших функций, так как это дополнительный шаг, который не требуется.

  5. to управлять таймером l oop в tkinter мы можем использовать after().

Попробуйте это:

import tkinter as tk
import time


def count_down(sec):
        if sec > 0:
            timer.configure(text=time.strftime('%S', time.gmtime(sec)))
            win.after(1000, lambda: count_down(sec-1))
        else:
            timer.configure(text='GAME OVER!')


win = tk.Tk()
win.configure(bg='black')
sec = 11

header = tk.Label(win, text="Game Timer", fg='blue', bg='black', font=('Arial Bold', 14))
timer = tk.Label(win, relief='sunken', fg='white', bg='black', font=('Arial', 14))
btn = tk.Button(win, text='Start', command=lambda: count_down(sec))

header.pack()
timer.pack(fill='both', expand=1)
btn.pack()
win.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...