Как установить кликающие часы в окне Pygame

python python-2.7 pygame-clock

298 просмотра

1 ответ

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pygame
import sys
import datetime
import time


class TextPicture(pygame.sprite.Sprite):

    def __init__(self, speed, location):
        pygame.sprite.Sprite.__init__(self)
        now = datetime.datetime.now()
        text = now.strftime("%H:%M:%S")
        font = pygame.font.Font(None, 40)
        time_text = font.render(text, 1, [0, 0, 0])  # show now time
        self.image = time_text
        self.speed = speed
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location

    def move(self):
        self.rect = self.rect.move(self.speed)
        if self.rect.left < 0 or self.rect.left > screen.get_width() - self.image.get_width():
            self.speed[0] = -self.speed[0]
        if self.rect.top < 0 or self.rect.top > screen.get_height() - self.image.get_height():
            self.speed[1] = -self.speed[1]


pygame.init()
screen = pygame.display.set_mode([640, 480])
my_time_picture = TextPicture([1, 1], [50, 50])


while 1:
    screen.fill([255, 255, 255])
    my_time_picture.move()
    screen.blit(my_time_picture.image, my_time_picture.rect)
    pygame.display.flip()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

Я создаю часы, которые могут двигаться на экране. Но то, что мой код может сделать сейчас, это показать неизменное время. Я хочу нажать и сосчитать время. Моя неизменная картина часов

И я хочу сделать свои часы красивее, но не знаю как. Я буду очень признателен, если кто-нибудь может сделать какие-либо предложения.

Автор: Black Bob Источник Размещён: 08.11.2019 11:16

Ответы (1)


2 плюса

Решение

Вы можете сделать это, используя pygame.time.set_timer()для генерации «тиковых событий», которые приводят к обновлению изображения часов при обнаружении в цикле обработки событий.

Чтобы упростить реализацию, update()в DigitalClockкласс можно добавить метод (который я переименовал в ваш универсальный TextPictureкласс), который только обновляет изображение, но оставляет текущее местоположение в покое:

import datetime
import sys
import time
import pygame

class DigitalClock(pygame.sprite.Sprite):
    def __init__(self, speed, location):
        pygame.sprite.Sprite.__init__(self)
        self.speed = speed
        self.font = pygame.font.Font(None, 40)
        self.rect = pygame.Rect(location, (0, 0))  # placeholder
        self.update()

    def update(self):
        location = self.rect.left, self.rect.top  # save position
        time_text = datetime.datetime.now().strftime("%H:%M:%S")
        self.image = self.font.render(time_text, 1, [0, 0, 0])
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location  # restore position

    def move(self):
        self.rect = self.rect.move(self.speed)
        if (self.rect.left < 0
            or self.rect.left > screen.get_width()-self.image.get_width()):
            self.speed[0] = -self.speed[0]
        if (self.rect.top < 0
            or self.rect.top > screen.get_height()-self.image.get_height()):
            self.speed[1] = -self.speed[1]

После этого вам нужно изменить обработку так, чтобы она была такой:

pygame.init()
framerate_clock = pygame.time.Clock()
screen = pygame.display.set_mode([640, 480])
my_digital_clock = DigitalClock([1, 1], [50, 50])
TICK_EVENT = pygame.USEREVENT + 1
pygame.time.set_timer(TICK_EVENT, 1000)  # periodically create TICK_EVENT

while True:
    for event in pygame.event.get():
        if event.type == TICK_EVENT:
            my_digital_clock.update()  # call new method
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    screen.fill([255, 255, 255])
    my_digital_clock.move()
    screen.blit(my_digital_clock.image, my_digital_clock.rect)

    framerate_clock.tick(60)  # limit framerate
    pygame.display.flip()

Вы можете сделать его более красивым, используя другой шрифт и цвет. Обычно все, что делает его более реалистичным, будет улучшением. Было бы здорово сделать так, чтобы двоеточия между цифрами и цифрами мигали (используя аналогичную технику).

Автор: martineau Размещён: 20.08.2016 01:27
Вопросы из категории :
32x32