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