主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

より多くの人に向けたGUIデザインのために(基本的なこととツール製作)

                
tags:
 HTMLを書いた経験がある人などはよくわかると思うが、色は赤、緑、青の3つの光の強さのバランスで現れる。すべての色はその3色の強度をコントロールすることで表現できる。なぜこの3色になっているかというと、ヒトの目に備わっている色を見分けるセンサーが3種類だからだ。そしてヒトならだれでも色を見分けるセンサーが3種類あるかというとそうではない。
 これから書く説明は簡便のために、事実を簡略化している。そのため正確さを欠くことがある。興味を持ったとしたら、正確なことを『カラーユニバーサルデザイン』や『色弱』などで調べて、追ってもらいたい。
 色を見分けるセンサーを1種類しか持たない人がごくまれにいる。10万人に1人ぐらいだと言われている。この人は明るさを見分けることはできるから、白いポロシャツと黒いポロシャツの違いはわかる。しかし、それが赤と緑だと違いがわからないことがある。どういう色に見えているかはクオリアのことがあるので断定できないが、少なくとも単色で世界を見ているということになる。次にセンサーを2種類持っている人である。これは案外多い。男では5%ぐらいだ。5%だと100人に5人程度だと言って大した数ではないと判断する人がいる。日本人男性の総人口は6000万人で、その5%は300万人だ。ビジネスをしようとするならばかにできない数だろう。
 
 ぼくはゲームが好きでそれなりにやってきた。しかしそれらを改めて見てみると、より多くの人がそのゲームをやれるように配色デザインされていないようなものを見る。キャラクターの配色をいじるのはデザイン上むずかしいところはあるだろうが、テキストやゲージの色などなら簡単だろう。最近のゲーム市場は海外進出を高らかに謳っているのだから、5%の母数を世界のゲームプレイヤーの数とすればなかなかのものになるはずだ。

120719_1.png
左:通常 右:緑に弱い視覚をシミュレート

120719_2.png
左:通常 右:赤に弱い視覚をシミュレート


 そういったものを簡便にチェックするために、PyGTKでツールを作った。PCスクリーンの任意の場所をキャプチャ、色を変えてウィンドウに表示。画像としてシーンを保存など。OSに依存するモジュールなどは使っていないので、Win、Linux、Macそれぞれで使えるはず。Python2.6、GTK2.20、Win7で動作チェックした。

120725.png



#-*- coding: utf-8 -*-

##import math
import cairo
import gtk
##from gtk import gdk
import gobject
import sys

import datetime
import time


root = gtk.gdk.get_default_root_window()
XML = """<?xml version="1.0"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<property name="title" translatable="yes">Makestomy</property>
<property name="default_width">440</property>
<property name="default_height">250</property>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="width_request">150</property>
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<child>
<object class="GtkSpinButton" id="spinbutton1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<property name="adjustment">adjustment1</property>
<property name="climb_rate">1</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spinbutton2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<property name="adjustment">adjustment2</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">13</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox3">
<property name="visible">True</property>
<child>
<object class="GtkSpinButton" id="spinbutton3">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<property name="adjustment">adjustment3</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spinbutton4">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<property name="adjustment">adjustment4</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">13</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame1">
<property name="visible">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="left_padding">12</property>
<child>
<object class="GtkVBox" id="vbox2">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkRadioButton" id="radiobutton1">
<property name="label" translatable="yes">C</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radiobutton2">
<property name="label" translatable="yes">P</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<property name="group">radiobutton1</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radiobutton3">
<property name="label" translatable="yes">D</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<property name="group">radiobutton1</property>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;Type&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox4">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">Play</property>
<property name="width_request">50</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button2">
<property name="label" translatable="yes">Pause</property>
<property name="width_request">50</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button3">
<property name="label" translatable="yes">Save
Scene</property>
<property name="width_request">50</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">13</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkDrawingArea" id="drawingarea1">
<property name="visible">True</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkAdjustment" id="adjustment1">
<property name="value">1</property>
<property name="upper">32000</property>
<property name="step_increment">1.0099999997764826</property>
<property name="page_increment">10</property>
<property name="page_size">10</property>
</object>
<object class="GtkAdjustment" id="adjustment2">
<property name="upper">32000</property>
<property name="step_increment">5</property>
<property name="page_increment">10</property>
<property name="page_size">10</property>
</object>
<object class="GtkAdjustment" id="adjustment3">
<property name="value">10</property>
<property name="upper">32000</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
<property name="page_size">10</property>
</object>
<object class="GtkAdjustment" id="adjustment4">
<property name="value">10</property>
<property name="upper">32000</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
<property name="page_size">10</property>
</object>
</interface>
"""

class ShapedWindow:
def __init__(self):
self.builder = gtk.Builder()
self.builder.add_from_string(XML)
self.window = self.builder.get_object("window1")
self.image = self.builder.get_object("drawingarea1")

self.x = self.builder.get_object("spinbutton1")
self.x.set_adjustment(gtk.Adjustment(value=0, lower=0, upper=32000, step_incr=5, page_incr=0, page_size=0))
self.y = self.builder.get_object("spinbutton2")
self.y.set_adjustment(gtk.Adjustment(value=0, lower=0, upper=32000, step_incr=5, page_incr=0, page_size=0))
self.width = self.builder.get_object("spinbutton3")
self.width.set_adjustment(gtk.Adjustment(value=300, lower=10, upper=32000, step_incr=5, page_incr=0, page_size=0))
self.height = self.builder.get_object("spinbutton4")
self.height.set_adjustment(gtk.Adjustment(value=300, lower=10, upper=32000, step_incr=5, page_incr=0, page_size=0))

self.button_c = self.builder.get_object("radiobutton1")
self.button_p = self.builder.get_object("radiobutton2")
self.button_d = self.builder.get_object("radiobutton3")

self.button_play = self.builder.get_object("button1")
self.button_play.connect("clicked", self.play)
self.button_pause = self.builder.get_object("button2")
self.button_pause.connect("clicked", self.pause)
self.button_save = self.builder.get_object("button3")
self.button_save.connect("clicked", self.save)

self.window.connect("destroy", self.close_application)

self.timer = gobject.timeout_add(1000, self.capture)
self.window.show_all()



def capture(self):
x = self.x.get_value_as_int()
y = self.y.get_value_as_int()
width = self.width.get_value_as_int()
height = self.height.get_value_as_int()
self.image.set_size_request(width, height)
pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, width, height)
pixbuf.get_from_drawable(gtk.gdk.get_default_root_window(), gtk.gdk.colormap_get_system(), x, y, 0, 0, width, height)

self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, pixbuf.get_width(), pixbuf.get_height())
ctx = cairo.Context(self.surface)
gdkctx = gtk.gdk.CairoContext(ctx)
gdkctx.set_source_pixbuf(pixbuf,0,0)
gdkctx.paint()
ia = self.surface.get_data()

label = [r for r in self.button_c.get_group() if r.get_active()][0].get_label()
if label != "C":
if label == "P":
color_channel = 2
elif label == "D":
color_channel = 1
length = len(ia) / 4
ia[color_channel: :4] = ('\x00') * length

cr = self.image.window.cairo_create()
cr.set_source_surface(self.surface, 0, 0)
cr.paint()

return True

def pause(self, widget):
gobject.source_remove(self.timer)
return True

def play(self, widget):
self.timer = gobject.timeout_add(1000, self.capture)
return True

def save(self, widget):
filename = "cap_%s.png" %(datetime.datetime.now().strftime("%Y%m%dT%H%M%S"))
self.surface.write_to_png(filename)
return True

def close_application(self, widget):
gtk.main_quit()
return False

if __name__ == '__main__':
win = ShapedWindow()
gtk.main()
lt;property name=
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。