例によって、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プログラミング、お楽しみください。(笑)