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