2010年9月9日木曜日

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

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

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


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


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


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


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

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






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


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

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

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

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

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

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

  1. #!/usr/bin/env python  
  2. # -*- coding: utf-8 -*-  
  3. import sys  
  4. import commands  
  5. import os  
  6. import os.path  
  7. import pygtk  
  8. import gtk  
  9.   
  10. __author__="kaoru"  
  11. __date__ ="$2010/08/28 13:42:04$"  
  12.   
  13. #インストールコマンド群  
  14. installCommands=(  
  15.     (   #みくつべ♪インストールコマンド群  
  16.         "gksudo add-apt-repository ppa:khf03353/ppa-kaorin","gksudo apt-get update",'gksudo "apt-get -y install mikutube"'  
  17.     ),  
  18.     (   #みくかべ♪インストールコマンド群  
  19.         "gksudo add-apt-repository ppa:khf03353/ppa-kaorin","gksudo apt-get update",'gksudo "apt-get -y install mikukabe"'  
  20.         ),  
  21.     (   #audaciousスキンインストールコマンド群  
  22.         "gksudo apt-get update",'gksudo "apt-get -y install audacious"',  
  23.         #gksudo に渡す際に"でコマンドをくくる必要があるので、文字列定義としては'を使っている  
  24.         'gksudo "wget -P /usr/share/audacious/Skins/ http://mangareview.up.seesaa.net/image/mikumiku001.tar.gz"',  
  25.         'gksudo "wget -P /usr/share/audacious/Skins/ http://mangareview.up.seesaa.net/image/mikumiku_00220.tar.gz"',  
  26.         'gksudo "wget -P /usr/share/audacious/Skins/ http://mangareview.up.seesaa.net/image/mikumiku_003.tar.gz"',  
  27.         'gksudo "tar xvzf /usr/share/audacious/Skins/mikumiku001.tar.gz -C /usr/share/audacious/Skins/"',  
  28.         'gksudo "tar xvzf /usr/share/audacious/Skins/mikumiku_00220.tar.gz -C /usr/share/audacious/Skins/"',  
  29.         'gksudo "tar xvzf /usr/share/audacious/Skins/mikumiku_003.tar.gz -C /usr/share/audacious/Skins/"',  
  30.         'gksudo "rm -f /usr/share/audacious/Skins/mikumiku001.tar.gz"',  
  31.         'gksudo "rm -f /usr/share/audacious/Skins/mikumiku_00220.tar.gz"',  
  32.         'gksudo "rm -f /usr/share/audacious/Skins/mikumiku_003.tar.gz"',  
  33.     )  
  34. )  
  35. class MikunchApp:  
  36.   
  37.     def __init__(self):  
  38.   
  39.         #Set the Glade file  
  40.         self.gladefile = "mikunchu.ui"  
  41.         self.wTree = gtk.Builder()  
  42.         self.wTree.add_from_file(os.path.dirname(os.path.abspath(__file__)) + "/"+self.gladefile)  
  43.         #Create our dictionay and connect it  
  44.         dic = {  
  45.                 "on_btCansel_clicked" : self.on_btnCancel_clicked,  
  46.                 "on_btOK_clicked" : self.on_btnOK_clicked,  
  47.                 "on_TopLevel_destroy" : self.on_TopLevel_destroy }  
  48.         self.commands = []  
  49.         self.configs = []  
  50.         self.chkMikutube = self.wTree.get_object("chkMikutube")  
  51.         self.chkMikukabe = self.wTree.get_object("chkMikukabe")  
  52.         self.chkAudacious = self.wTree.get_object("chkAudacious")  
  53.         self.cmbAudaciousConf = self.wTree.get_object("cmbAudaciousCfg")  
  54.         lsAudaciousConf = self.wTree.get_object ("listAudaciousCfg")  
  55.         self.cmbAudaciousConf.set_model(lsAudaciousConf)  
  56.         cell = gtk.CellRendererText()  
  57.         self.cmbAudaciousConf.pack_start(cell, True)  
  58.         self.cmbAudaciousConf.add_attribute(cell, 'text'0)  
  59.         self.cmbAudaciousConf.set_active(0)  
  60.           
  61.         self.wTree.connect_signals(dic)  
  62.   
  63.         self.mainWindow = self.wTree.get_object ("TopLevel")  
  64.         self.mainWindow.show_all()  
  65.   
  66.     def on_TopLevel_destroy(self, widget):  
  67.         #ウィンドウを閉じてアプリケーションを終了する  
  68.         gtk.main_quit()  
  69.   
  70.     def on_btnOK_clicked(self,widget):  
  71.         #適用を行ってアプリケーションを終了する  
  72.         if self.chkMikutube.get_active() == True:  
  73.             #みくつべ♪インストールコマンドを実行  
  74.             for cmd in installCommands[0]:  
  75.                 self.execCommand(cmd)  
  76.         if self.chkMikukabe.get_active() == True:  
  77.             #みくかべ♪インストールコマンドを実行  
  78.             for cmd in installCommands[1]:  
  79.                 self.execCommand(cmd)  
  80.         if self.chkAudacious.get_active() == True:  
  81.             #Audacious用のスキンインストールと適用  
  82.             for cmd in installCommands[2]:  
  83.                 self.execCommand(cmd)  
  84.             sel = self.cmbAudaciousConf.get_active()  
  85.             configpath = os.path.expanduser("~") + "/.config/audacious/config"  
  86.             confName = ("mikumiku001","mikumiku_002 ","mikumiku_003")  
  87.             self.editConfig("skin=""skin=/usr/share/audacious/Skins/"+confName[sel], configpath)  
  88.             self.editConfig('allow_broken_skins=',"allow_broken_skins=TRUE", configpath)  
  89.   
  90.         #ウィンドウを閉じてアプリケーションを終了する  
  91.         gtk.main_quit()  
  92.   
  93.     def on_btnCancel_clicked(self,widget):  
  94.         #ウィンドウを閉じてアプリケーションを終了する  
  95.         gtk.main_quit()  
  96.   
  97.     #コマンド実行のメソッド  
  98.     def execCommand(self,command):  
  99.         print command   #受け渡されたコマンドのデバッグ用プリント  
  100.         ret = commands.getoutput(command)  
  101.         print ret             #実行結果のデバッグ用プリント  
  102.         return ret  
  103.   
  104.     #設定ファイルの書き換え  
  105.     def editConfig(self,keyword,replaceString,configPath):  
  106.         print keyword  
  107.         print replaceString  
  108.         f = open(configPath)  
  109.         def edit(f):  
  110.             '''''キーワードが見つかったら置き換え文字列を返すローカル関数 '''  
  111.             for txt in f:  
  112.                 if txt.strip().find(keyword) >= 0:  
  113.                     yield replaceString+"\n"  
  114.                 else:  
  115.                     yield txt  
  116.         cnf = [x for x in edit(f)]  
  117.         f.close()  
  118.         fw = open(configPath,"w")  
  119.         fw.writelines(cnf)  
  120.         fw.close()  
  121.   
  122. if __name__ == "__main__":  
  123.     MikunchApp()  
  124.     gtk.main()  

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

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

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

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

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

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

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

2 件のコメント:

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

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

    返信削除