Ubuntu Weekly Recipe

第424回 GUIプログラムをPython/Ruby/ECMAScriptで書く

この記事を読むのに必要な時間:およそ 6.5 分

先週の記事に対するお詫び
前回の記事において,Ubuntuプロジェクトでのパッケージの取り扱いについて,筆者の事実誤認による誤った記述がありました。主要な誤りは2点で,パッケージの分類基準と,Feature Freezeの説明です。他にも説明の誤りがあり,全面的に内容を修正しました。読者の皆様にはご迷惑をおかけしたことをお詫びいたします。

Ubuntuのデスクトップ環境は,ウェブブラウザなどユーザーが必要とするソフトウェアがデフォルトでインストールされているため,そのままでも十分に便利です。主要なシステム設定もマウスで行えるため,Unixライクな環境にありがちな「真っ黒な画面にコマンドをひたすら入力する」という,すなわちコマンドラインによる操作をしなくても一通りのことができます。

しかし一度困難に陥ると,真っ黒な画面での操作すなわちコマンドラインによる操作を要求されます。簡単なコマンドだったら苦になりませんが,オプションがたくさんあるコマンドは記憶を要求されるため面倒です。このような場合,うまくラップするようなシェルスクリプトを書くのが典型です。

このようなシェルスクリプトを第3者に渡す必要がある場合,作者である自分しか使い方を理解していないため,ドキュメント整備やヘルプの整備などの労力が発生します。こういう時,⁠あぁ,画面に案内を提示して,それをユーザーが操作する類のインタラクティブなインターフェイスだったらいいのに」と考えてしまいます。

本連載の第422回ではwhiptailとシェルスクリプトとの組み合わせで,インタラクティブなツールの作り方を紹介しました。この方法は手軽ですが,実現可能な処理がシェルスクリプトで書ける範囲となります。シェルスクリプトでも結構な処理が記述できますが,シェルスクリプトが苦手とするような処理を書く場合,この方法は使えません。せっかく凝ったことをするなら,自分がよく使っている言語で書きたいものです。

Gtk+3を利用したGUIプログラム

多くのユーザーが使用している言語の代表例は,Python 3,Ruby,ECMAScriptです。今回はそれらスクリプト言語で簡単なGUIをプログラムします。GUIツールキットとしてGtk+3を利用し,ウィンドウを描画します。

なお,実行環境はUbuntuデスクトップを前提としますので,Ubuntu PhoneやSnappy Ubuntu Coreではまた別の作法が必要であることに注意してください。

Python 3の場合

Python 3を使った場合のプログラムは,次のとおりです。

#!/usr/bin/env python3

import gi

gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

from gi.repository import GLib
import signal

class Sample(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_title('Gtk+3 sample')
        self.set_border_width(20)

        vbox = Gtk.Box()
        vbox.set_orientation(Gtk.Orientation.VERTICAL)
        vbox.set_spacing(10)
        self.add(vbox)

        topbox = Gtk.Box()
        topbox.set_spacing(10)
        vbox.pack_start(topbox, True, True, 0)

        button = Gtk.Button()
        button.set_label('swap')
        button.connect('clicked', self.on_click_swap)
        topbox.pack_start(button, True, True, 0)

        button = Gtk.Button()
        button.set_label('close')
        button.set_use_underline(True)
        button.connect('clicked', self.on_click_close)
        topbox.pack_start(button, True, True, 0)

        bottombox = Gtk.Box()
        bottombox.set_spacing(10)
        vbox.pack_start(bottombox, True, True, 0)

        self.entry = Gtk.Entry()
        self.entry.set_text('left')
        bottombox.pack_start(self.entry, True, True, 0)

        self.label = Gtk.Label()
        self.label.set_text('right')
        bottombox.pack_start(self.label, True, True, 0)

        self.connect('delete-event', Gtk.main_quit)

        GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGINT, \
                             self.handle_unix_signal, None)

    def handle_unix_signal(self, user_data):
        self.on_click_close( None)

    def on_click_swap(self, button):
        label = self.label.get_text()
        self.label.set_text(self.entry.get_text())
        self.entry.set_text(label)

    def on_click_close(self, button):
        Gtk.main_quit()

win = Sample()
win.show_all()

Gtk.main()

コードの解説は後述します。python3.pyというファイルにこのプログラムを保存し,権限を付与して実行すると,以下のウィンドウが開きます。

$ gedit python3.py
$ chmod a+x python3.py
$ ./python3.py

図1 Python 3で書いたGtk+3アプリケーション

画像

著者プロフィール

坂本貴史(さかもとたかし)

Ubuntuのマルチメディア編集環境であるUbuntu Studioのユーザ。主にUbuntu日本コミュニティとUbuntu Studioコミュニティで活動。いつかユーザ同士で合作するのが夢。

コメント

コメントの記入