ポケット倉庫@ Wiki

pygtkでスクリーンショットツール "scrot"のUIを作る。

最終更新:

kani_3

- view
メンバー限定 登録/ログイン

スクリーンショット scrot のUI


python + pygtkを使ってscrotのUIを作ってみました。
kss.pyというファイルのみです。
現状では、設定した内容を次回の起動時に引き継ぐことができません。

実行するためには、以下のものが必要です。
  • scrot
  • python
  • pygtk

実行方法:

   python 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
名前:
コメント:

すべてのコメントを見る
添付ファイル
記事メニュー
目安箱バナー