如何在 pygame window 中设置点击时钟

How to set a clicking clock in a pygame window

#!/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()

我正在设计一个可以在屏幕上移动的时钟。但是我的代码现在可以做的是显示一个不变的时间。我想点击并计算时间。 My invariable clock picture

而且我想让我的时钟更漂亮,但不知道怎么做。如果有人能提出任何建议,我将不胜感激。

您可以通过使用 pygame.time.set_timer() 生成 "tick events" 来实现,这会导致时钟的图像在事件处理循环中遇到时更新。

为了更容易实施,可以将 update() 方法添加到 DigitalClock class(这是我重命名的通用 TextPicture class) 仅更新图像,但单独保留当前位置:

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()

您可以使用不同的字体和颜色使它更漂亮。一般来说,任何让它看起来更逼真的东西都是一种改进。让数字字符之间的冒号闪烁(使用类似的技术)可能会很酷。