2010年9月9日木曜日

選択するという機能を加えるために--ドロップダウンリストを作ってみよう

一応、第一部完のつもりだったんですが、GTKウィジェットの使い方の中でも、わりと頻繁に使うと思われる、ドロップダウンリストに関してなんもやってなかったので、オプションとして追記します。

例によって、Gladeの作業です。


スロットを追加します。
そんで、コンテナから、横方向の水平ボックスを追加します。数は2個としときましょう。


左側にチェックボックスを追加します。


そしたら、次は右側にコンボボックスを追加しましょう。


このままでは、コンボボックスに表示する中身がないことになるので、「ComboBoxモデル」 を選択します。
現時点ではモデルはなにもないので、新規に作成して、名前を指定しましょう。
とりあえず、空のコンボボックスの選択用モデルが出来上がります。

そしたら、そのモデルに選択用の中身を並べていきます。






文字列なので、種類をgchararrayにするのを、忘れない様に。
そして、一応タイトルも付けときましょう。
その後、その下の箱の中に選択肢を入れていきます。


一応、これでGladeの作業は終わりになります。

コンボボックスに関しては、libGlade使ってた時の方が簡単だったかな、と思わないでもないです。
まだ、この辺に関してはGTKBuilderが熟成されていないのか。

この後、ソースコードを貼っとこうかと思ったんですがー。
ま、貼っときますか。(笑)

その前に。
これ、実行すると、こんな感じになります。

audaciousの方にチェックをつけて、ドロップダウンから選択すると、その選択したスキンが適用されます。
まあ、その前に設定ファイルがないと書き換えが行えないので、一度は実行しといて貰わないと困るわけですが。(笑)
#ま、その辺は、本格的に運用するもんでもないサンプルだからなー、くらいのところで。

というわけで、詳細解説は次回。
面倒なんだ、ドロップダウンは。(^^;

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import commands
import os
import os.path
import pygtk
import gtk

__author__="kaoru"
__date__ ="$2010/08/28 13:42:04$"

#インストールコマンド群
installCommands=(
    (   #みくつべ♪インストールコマンド群
        "gksudo add-apt-repository ppa:khf03353/ppa-kaorin","gksudo apt-get update",'gksudo "apt-get -y install mikutube"'
    ),
    (   #みくかべ♪インストールコマンド群
        "gksudo add-apt-repository ppa:khf03353/ppa-kaorin","gksudo apt-get update",'gksudo "apt-get -y install mikukabe"'
        ),
    (   #audaciousスキンインストールコマンド群
        "gksudo apt-get update",'gksudo "apt-get -y install audacious"',
        #gksudo に渡す際に"でコマンドをくくる必要があるので、文字列定義としては'を使っている
        'gksudo "wget -P /usr/share/audacious/Skins/ http://mangareview.up.seesaa.net/image/mikumiku001.tar.gz"',
        'gksudo "wget -P /usr/share/audacious/Skins/ http://mangareview.up.seesaa.net/image/mikumiku_00220.tar.gz"',
        'gksudo "wget -P /usr/share/audacious/Skins/ http://mangareview.up.seesaa.net/image/mikumiku_003.tar.gz"',
        'gksudo "tar xvzf /usr/share/audacious/Skins/mikumiku001.tar.gz -C /usr/share/audacious/Skins/"',
        'gksudo "tar xvzf /usr/share/audacious/Skins/mikumiku_00220.tar.gz -C /usr/share/audacious/Skins/"',
        'gksudo "tar xvzf /usr/share/audacious/Skins/mikumiku_003.tar.gz -C /usr/share/audacious/Skins/"',
        'gksudo "rm -f /usr/share/audacious/Skins/mikumiku001.tar.gz"',
        'gksudo "rm -f /usr/share/audacious/Skins/mikumiku_00220.tar.gz"',
        'gksudo "rm -f /usr/share/audacious/Skins/mikumiku_003.tar.gz"',
    )
)
class MikunchApp:

    def __init__(self):

        #Set the Glade file
        self.gladefile = "mikunchu.ui"
        self.wTree = gtk.Builder()
        self.wTree.add_from_file(os.path.dirname(os.path.abspath(__file__)) + "/"+self.gladefile)
        #Create our dictionay and connect it
        dic = {
                "on_btCansel_clicked" : self.on_btnCancel_clicked,
                "on_btOK_clicked" : self.on_btnOK_clicked,
                "on_TopLevel_destroy" : self.on_TopLevel_destroy }
        self.commands = []
        self.configs = []
        self.chkMikutube = self.wTree.get_object("chkMikutube")
        self.chkMikukabe = self.wTree.get_object("chkMikukabe")
        self.chkAudacious = self.wTree.get_object("chkAudacious")
        self.cmbAudaciousConf = self.wTree.get_object("cmbAudaciousCfg")
        lsAudaciousConf = self.wTree.get_object ("listAudaciousCfg")
        self.cmbAudaciousConf.set_model(lsAudaciousConf)
        cell = gtk.CellRendererText()
        self.cmbAudaciousConf.pack_start(cell, True)
        self.cmbAudaciousConf.add_attribute(cell, 'text', 0)
        self.cmbAudaciousConf.set_active(0)
        
        self.wTree.connect_signals(dic)

        self.mainWindow = self.wTree.get_object ("TopLevel")
        self.mainWindow.show_all()

    def on_TopLevel_destroy(self, widget):
        #ウィンドウを閉じてアプリケーションを終了する
        gtk.main_quit()

    def on_btnOK_clicked(self,widget):
        #適用を行ってアプリケーションを終了する
        if self.chkMikutube.get_active() == True:
            #みくつべ♪インストールコマンドを実行
            for cmd in installCommands[0]:
                self.execCommand(cmd)
        if self.chkMikukabe.get_active() == True:
            #みくかべ♪インストールコマンドを実行
            for cmd in installCommands[1]:
                self.execCommand(cmd)
        if self.chkAudacious.get_active() == True:
            #Audacious用のスキンインストールと適用
            for cmd in installCommands[2]:
                self.execCommand(cmd)
            sel = self.cmbAudaciousConf.get_active()
            configpath = os.path.expanduser("~") + "/.config/audacious/config"
            confName = ("mikumiku001","mikumiku_002 ","mikumiku_003")
            self.editConfig("skin=", "skin=/usr/share/audacious/Skins/"+confName[sel], configpath)
            self.editConfig('allow_broken_skins=',"allow_broken_skins=TRUE", configpath)

        #ウィンドウを閉じてアプリケーションを終了する
        gtk.main_quit()

    def on_btnCancel_clicked(self,widget):
        #ウィンドウを閉じてアプリケーションを終了する
        gtk.main_quit()

    #コマンド実行のメソッド
    def execCommand(self,command):
        print command   #受け渡されたコマンドのデバッグ用プリント
        ret = commands.getoutput(command)
        print ret             #実行結果のデバッグ用プリント
        return ret

    #設定ファイルの書き換え
    def editConfig(self,keyword,replaceString,configPath):
        print keyword
        print replaceString
        f = open(configPath)
        def edit(f):
            '''キーワードが見つかったら置き換え文字列を返すローカル関数 '''
            for txt in f:
                if txt.strip().find(keyword) >= 0:
                    yield replaceString+"\n"
                else:
                    yield txt
        cnf = [x for x in edit(f)]
        f.close()
        fw = open(configPath,"w")
        fw.writelines(cnf)
        fw.close()

if __name__ == "__main__":
    MikunchApp()
    gtk.main()

微妙に増えてますが、増えてるのは、ほとんどがコマンドです。
長いんで、分割して書いてますけど。

これ、実行すると、audaciousのスキンを書き換えてくれます。

まあ、画像突っ込んだせいで、ページもでかくなりましたし、追加したコードの解説は次回やりますかね。
オプション部分だし、まあ、そんなにあせらんでもよいでしょう。

基本的に、これくらいの母体があれば、ダイアログベースのフロントエンドは、これを改造することで行けるはずです。

まあ、第2部は、もう少し「プログラム設計」的な部分を中心に、やっぱりGUIフロントエンドをやろうかと思ってますが。

なんか、こういうのをネタにして欲しい的なものがあれば、コメントいただければ考えてみます。

まあ、とはいえ、ここで頑張っても、人生において、もっとも重要なおっぱいには近づけない、というのがワタクシ的には腑に落ちないものがありますが、まあ、プログラミングとおっぱいは、まるで関係ないですからねぇ。
非常に残念です。

2 件のコメント:

  1. プログラミングがうまいひとはおっぱいもうまいと思います。
    GUIプログラミングはあまりしたことがないので参考になりました!

    返信削除
  2. こめんとありがとうござます。
    ご参考になったのであれば、これほど嬉しいことはありません。
    引き続き、GUIプログラミング、お楽しみください。(笑)

    返信削除