スクリーンショット scrot のUI
python + pygtkを使ってscrotのUIを作ってみました。
kss.pyというファイルのみです。
現状では、設定した内容を次回の起動時に引き継ぐことができません。
kss.pyというファイルのみです。
現状では、設定した内容を次回の起動時に引き継ぐことができません。
実行するためには、以下のものが必要です。
- scrot
- python
- pygtk
実行方法:
python kss.py
ソースコード
以下は表示の都合で行頭に余分なスペースがあります。
コピペする場合には御注意ください。
(ソースファイルはこのページの一番下に添付しました。ファイル名:kss.py)
コピペする場合には御注意ください。
(ソースファイルはこのページの一番下に添付しました。ファイル名:kss.py)
#!/usr/bin/python
# -*- coding: euc_jp -*-
import os
import pygtk
pygtk.require('2.0')
import gtk
#
#
class KaniSnapShotWindow:
'''
スクリーンショットを取るコマンド「scrot」のフロントエンド。
GUIで設定された内容をもとに文字列を作成して
コマンドとして実行する。
'''
DEF_FILE_NAME = '%Y-%m-%d_$wx$h.png'
DEF_OUTPUT_DIR = '~/'
##
def __init__(self,
i_filename = DEF_FILE_NAME,
i_outputDir = DEF_OUTPUT_DIR,
i_delaySec = 0,
i_sel = False,
i_oneshot = True):
'''
初期化処理
GTKを使ってユーザインターフェイスを生成する。
'''
# ウインドウを生成する。
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect('delete_event', self.on_quit)
self.window.set_border_width(5)
contentsBox = gtk.VBox(False, 0)
# ファイル名入力フィールドを作成してウインドウに配置
fnameBox = gtk.HBox(False, 0)
label = gtk.Label('File Name:')
label.set_size_request(100, -1)
fnameBox.pack_start(label, False, False, 0)
self.filename = gtk.Entry()
if len(i_filename) > 0:
self.filename.set_text(i_filename)
fnameBox.pack_start(self.filename, False, False, 0)
contentsBox.pack_start(fnameBox, False, False, 2)
# 画像の最終保存先ディレクトリ選択用UIを作成してウインドウに配置
dirBox = gtk.HBox(False, 0)
label = gtk.Label('Output Directory:')
label.set_size_request(100, -1)
dirBox.pack_start(label, False, False, 0)
self.outputDir = gtk.Entry()
if len(i_outputDir) > 0:
self.outputDir.set_text(i_outputDir)
dirBox.pack_start(self.outputDir, False, False, 0)
btn = gtk.Button('...')
btn.connect('clicked', self.on_button_sel_output_dir)
dirBox.pack_end(btn, False, False, 0)
contentsBox.pack_start(dirBox, False, False, 2)
# ディレイ入力フィールドを作成してウインドウに配置
delayBox = gtk.HBox(False, 0)
# ラベルを配置
label = gtk.Label('Delay:')
label.set_size_request(100, -1)
delayBox.pack_start(label, False, False, 0)
# コンボボックスを配置し、コンボボックスのメニュー項目を初期化
self.delayCombo = gtk.combo_box_new_text()
for i in range(5):
self.delayCombo.append_text(str(i)+' sec')
self.delayCombo.set_active(i_delaySec)
delayBox.pack_start(self.delayCombo, False, False, 0)
contentsBox.pack_start(delayBox, False, False, 2)
# そのほかのオプション
fr = gtk.Frame(' Options: ')
optBox = gtk.VBox(False, 4)
optBox.set_border_width(5)
# チェックボックス配置
self.chkSelection = gtk.CheckButton('Select window or rectangle.')
self.chkSelection.set_active(i_sel)
optBox.pack_start(self.chkSelection, False, False, 0)
# チェックボックス配置
self.chkOneShot = gtk.CheckButton('One shot')
self.chkOneShot.set_active(i_oneshot)
optBox.pack_start(self.chkOneShot, False, False, 0)
fr.add(optBox)
contentsBox.pack_start(fr, False, False, 2)
# セパレータを配置
sep = gtk.HSeparator()
contentsBox.pack_start(sep, False, False, 2)
# ボタン類の配置
# (1) closeボタン
btnBox = gtk.HBox(False, 0)
btn = gtk.Button('Close')
btn.connect('clicked', self.on_button_close)
btnBox.pack_start(btn, True, False, 0)
# (2) スクリーンショットボタン
btn = gtk.Button('Shoot')
btnBox.pack_end(btn, True, False, 0)
btn.connect('clicked', self.on_button_shoot)
contentsBox.pack_start(btnBox, False, False, 2)
# ウインドウの表示
self.window.add(contentsBox)
self.window.show_all()
# GTKのイベントループを開始
gtk.main()
##
def on_button_close(self, widget, event = None, data = None):
'''
closeボタンが押された場合の処理
'''
print 'close'
self.on_quit(widget, event, data)
##
def on_button_shoot(self, widget, event = None, data = None):
'''
scrotコマンド文字列を作成して実行する。
'''
# 出力先のディレクトリが存在することを確認。
# 存在しない場合には処理を中断
outdir = os.path.expanduser(self.outputDir.get_text())
outdir = os.path.normpath(outdir)
if os.path.isdir(outdir) == False:
print 'no such directory:%s' % outdir
return
# scrotコマンドの引数の情報(リスト)を作成
cmdArg = ['scrot']
fname = self.filename.get_text()
if len(fname) > 0:
cmdArg.append(fname)
cmdArg += ['-e',
'mv $f %s' % outdir,
'-d',
str(self.delayCombo.get_active())]
# Select window or rectangleのチェックがONだったら、
# -sオプションを追加。
if self.chkSelection.get_active():
cmdArg.append('-s')
# ウインドウをアイコン隠す
self.window.hide_all()
# スクリーンショットを取る前にkss自身のウインドウを閉じる
while gtk.events_pending():
gtk.main_iteration()
# スクリーンショットを取る
rc = os.spawnvp(os.P_WAIT, 'scrot', cmdArg)
print '== complete =='
# One shotだったらそのまま終了。
# そうでなければkss自身のウインドウを表示状態に戻す。
if self.chkOneShot.get_active():
self.on_quit(widget, event, data)
else:
self.window.show_all()
##
def on_button_sel_output_dir(self, widget, event = None, data = None):
'''
ディレクトリ選択ダイアログを表示。
選択されたディレクトリをテキストフィールドに設定する。
'''
print 'output dir sel'
chooser = gtk.FileChooserDialog('Select Output Directory',
None,
gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_OK, gtk.RESPONSE_OK))
chooser.set_default_response(gtk.RESPONSE_OK)
# ディレクトリ選択ダイアログを実行
resp = chooser.run()
if resp != gtk.RESPONSE_OK:
chooser.destroy()
return
# 選択結果を入力フィールドに設定
self.outputDir.set_text(chooser.get_filename())
# ダイアログの破棄
chooser.destroy()
##
def on_quit(self, widget, event = None, data = None):
'''
ウインドウが閉じられる(終了する)際に実行すべき処理。
'''
print 'on_quit'
# GTKのイベントループを終了させる。
gtk.main_quit()
return False
#
#
def kss_main():
KaniSnapShotWindow()
#
#
if __name__ == '__main__':
kss_main()
コメント
- コメントをいただけるとうれしいです。 -- (かに3) 2007-01-14 04:36:47
添付ファイル