pygame を使ってスライドショー

なぜかwindows標準らしきスライドショーの開始が数十秒かかるようになってしまっていて,使い勝手が悪い.なので画像を一定間隔で表示するだけのスライドショーを作った.ディレクトリを選択する機能はつけなかったのでスクリプトと同じディレクトリのファイルを読み込んで表示する.
画像以外のファイルも表示しようとするので,その場合は間隔が不等になることに今気付いた.まあいいや.

ディスプレイの解像度を取得する部分は
なんかいろいろこんぴゅーたかんけいのなぐりがき - python ctypesでディスプレイの解像度を取得する(win32)
を参考にして,ウィンドウを表示する位置については
pygameでウィンドウ位置の保存と復元 - tomoemonの日記
を参考にさせていただいたが,全画面表示で手抜きすることでその必要がなくなったので,後者はコメントアウトしておいた.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import pygame
import ctypes
import win32gui
from pygame.locals import *

def next_image(img_idx):
    img_idx += 1
    img_idx = img_idx%(len(gazo_list))
    try:
        img = pygame.image.load(gazo_list[img_idx])
    except:
        return img_idx
    img_size = img.get_size()
    if 1.0*img_size[0]/width > 1.0*img_size[1]/height:
        img_size_to = (width, int(1.0*img_size[1]*width/img_size[0]))
    else:
        img_size_to = (int(1.0*height*img_size[0]/img_size[1]), height)
    img = pygame.transform.smoothscale(img, img_size_to)
    img_rect = img.get_rect(center=(width/2,height/2))
    screen.fill(black)
    screen.blit(img, img_rect)
    return img_idx%(len(gazo_list))

def prev_image(img_idx):
    img_idx -= 2
    img_idx = img_idx%(len(gazo_list))
    img_idx = next_image(img_idx)
    return img_idx%(len(gazo_list))

dir_path = os.path.abspath(os.path.dirname(__file__))+"/"

gazo_list = os.listdir(dir_path)
for i in xrange(len(gazo_list)):
    gazo_list[i] = dir_path + gazo_list[i]

pygame.init()

size = width, height = ctypes.windll.user32.GetSystemMetrics(0), ctypes.windll.user32.GetSystemMetrics(1)

black = 0, 0, 0

#wm_info = pygame.display.get_wm_info()
#handle = wm_info['window']
#win32gui.MoveWindow(handle, 0, 0, width, height, 1)

screen = pygame.display.set_mode(size, pygame.FULLSCREEN)

img_idx = 0
last_time = 0
stop_toggle = 0

while 1:
    now_time = pygame.time.get_ticks()
    if now_time - last_time > 1000:
        last_time = now_time
        if(not stop_toggle):
            img_idx = next_image(img_idx)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == K_ESCAPE:
                sys.exit()
            if event.key == K_SPACE:
                stop_toggle = 0 if(stop_toggle) else 1
                last_time = pygame.time.get_ticks()
            if event.key == (K_RIGHT or K_DOWN):
                last_time = pygame.time.get_ticks()
                img_idx = next_image(img_idx)
            if event.key == (K_LEFT or K_UP):
                last_time = pygame.time.get_ticks()
                img_idx = prev_image(img_idx)

    font = pygame.font.Font(None, 30)
    text = font.render("Push ESC to EXIT.", True, (200,200,200))
    screen.blit(text, (0,0))
    text = font.render("Push ESC to EXIT.", True, (55,55,55))
    screen.blit(text, (0,20))
    pygame.display.flip()