例によって、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フロントエンドをやろうかと思ってますが。
なんか、こういうのをネタにして欲しい的なものがあれば、コメントいただければ考えてみます。
まあ、とはいえ、ここで頑張っても、人生において、もっとも重要なおっぱいには近づけない、というのがワタクシ的には腑に落ちないものがありますが、まあ、プログラミングとおっぱいは、まるで関係ないですからねぇ。
非常に残念です。
プログラミングがうまいひとはおっぱいもうまいと思います。
返信削除GUIプログラミングはあまりしたことがないので参考になりました!
こめんとありがとうござます。
返信削除ご参考になったのであれば、これほど嬉しいことはありません。
引き続き、GUIプログラミング、お楽しみください。(笑)