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

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

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

4

1 回答 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()

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

于 2016-08-20T13:27:53.873 回答