ちょっとPythonネタ。学校の授業の関係で最近Pygameを触ってる。今回のネタも課題のプログラムを少し調整したものになってる。ってよく考えたら課題と関係ねえ。
ともあれ、作ったのはPythonのRSS/Atom feed用モジュールであるfeedparserで読み込んだFeedを、Pygameを使って電光掲示板のようにスクロールして表示するスクリプト。実行すると以下のように表示される。
実際は右向きあるいは左向きにタイトルがスクロールしている。Pygameはそもそもゲーム作成用フレームワークなのでそういうアニメーションがかなり楽なんだよねー。
まぁ、これは、使い道と言っても、できるのはフィードのタイトルを眺めるくらいだし、そもそもPygameの実行環境持ってる人なんてほとんどいなさそうなので、どうしようもなかったりするんだけど。一応ソースは以下へ。
#!/usr/bin/evn python
# -*- coding:utf-8 -*-
import sys
import feedparser
import random
import pygame
from pygame.locals import *
SCREEN_WIDTH = 640
SCREEN_HIGHT = 480
MOVE_SPEED = 10
FONT_PATH = '/path/to/your/favorite/font'
FEED_LIMIT = 10
class ScrollText(pygame.sprite.Sprite):
def __init__(self, text, position = (0,0)):
pygame.sprite.Sprite.__init__(self)
font = pygame.font.Font(FONT_PATH, 32)
self.image = font.render(
text,
True,
(random.randint(0,255), random.randint(0,255), random.randint(0,255))
)
self.rect = self.image.get_rect()
self.speed = random.choice([-1, 1]) * random.randint(1,5)
self.rect.topleft = position
def update(self):
self.rect = self.rect.move(self.speed, 0)
if self.rect.left > SCREEN_WIDTH:
self.rect.right = 0
elif self.rect.right < 0:
self.rect.left = SCREEN_WIDTH
def get_titles_from(url):
feed = feedparser.parse(url)
titles = []
for entry in feed['entries']:
titles.append(entry.title)
return titles;
def main():
pygame.init()
screen = pygame.display.set_mode( (SCREEN_WIDTH, SCREEN_HIGHT) )
pygame.display.set_caption('feed neon')
if len(sys.argv) > 1:
feed_url = sys.argv[1]
else:
feed_url = 'http://b.hatena.ne.jp/hotentry?mode=rss'
feed_titles = get_titles_from(feed_url)
text_group = pygame.sprite.Group()
count = 0
for feed_title in feed_titles:
text = ScrollText(
feed_title,
(random.randint(0,SCREEN_WIDTH), 10 + 40 * count)
)
text_group.add(text)
count += 1
if count > FEED_LIMIT:
break
clock = pygame.time.Clock()
while True:
clock.tick(60)
for event in pygame.event.get():
if (event.type == QUIT
or (event.type == KEYDOWN and event.key == K_ESCAPE)):
return
screen.fill( (0,0,0) )
text_group.update()
text_group.draw(screen)
pygame.display.flip()
if __name__ == '__main__': main()
