PythonでGNOME用のアプレットを作成する

私はカルマと一時的に誤解していた尊敬されているVladXのリクエストでこの投稿を公開しています。



アプレットは、GNOMEパネルに直接埋め込むことができる小さなアプリケーションです。 通常、アプレットは特定の狭い機能(ボリュームの変更、デバイスのマウント)を実行します。これにより、アプレットはかさばるウィンドウアプリケーションと比較されます。 実際、知識のあるPythonコーダーが独自のアプレットを作成することは難しくありませんが、知らない人のための解決策があります。



行こう!



そこで、アプレットを作成しています。 アプレットは何かをしなければなりません。 たとえば、アプレットにはhabrakarmaとhabrasilが表示されます。 このすべての情報を取得するには、Habr APIを使用します 。



#!/ usr / bin / env python

#コーディング= utf-8

sys 、 os 、gtk、gtkをインポートします。 gdk 、pygtk、gnomeapplet、gnome



pygtk。 require ( '2.0' )



__USER__ = 'VladX'

__URL__ = 'http://habrahabr.ru/api/profile/' + __USER__




これがアプレットの始まりです。 ここではすべてが明確です-必要なライブラリをインポートし、必要なパラメーターを変数に入力します。 ロシア語の文字に関する問題を避けるために、UTF-8エンコードを使用します(そして、ちなみに、常に同じことを行うことをお勧めします)。



クラス MyApplet ( gnomeapplet。Applet ) :



def __init__ ( self 、applet、iid ) :



自己 。 アプレット =アプレット

自己 。 アプレット 。 set_name ( 'MyApplet' )

自己 。 hbox = gtk。 HBox ( )

自己 。 アプレット 。 追加 ( self。hbox )

自己 。 イベント = gtk。 イベントボックス ( )

自己 。 hbox add ( self。event )

自己 。 info = gtk。 ラベル ( )

自己 。 イベント add ( self。info ) #オブジェクトがさまざまなイベントに応答するには、イベントボックスに配置する必要があります

自己 。 イベント set_tooltip_text ( 'Habrauser' + __USER__ )

自己 。 イベント 接続 ( 'button-press-event' 、 self。callback_button )

self .__ init_popupmenu ( )

自己 。 アプレット 。 connect ( 'destroy' 、 self。callback_destroy )

自己 。 アプレット 。 show_all ( ) #パネルにこれをすべて表示する

自己 。 info 。 set_text ( self。get_info ( ) )



def __init_popupmenu ( self ) :



自己 。 アプレット 。 setup_menu ( '' '

<ポップアップ名= ' button3 '>

<menuitem name = ' Open Item ' verb = ' Open ' stockid = ' gtk- open ' />

<menuitem name = ' About Item ' verb = ' About ' stockid = ' gtk-about ' />

</ popup> ' ' ' 、 [

( 'Open' 、 self。Callback_open ) 、

( 'About' 、 self。Callback_about )

] 、 なし )



def get_info ( self ) :

'' 'たとえば、Pycurlを使用してリクエストを行います' ''

インポート pycurl、 StringIO

content = StringIO 。 StringIO ( )

c = pycurl。 カール ( )

c。 setopt ( pycurl。URL 、__URL__ )

c。 setopt ( pycurl。FOLLOWLOCATION 、 1 )

c。 setopt ( pycurl。WRITEFUNCTION 、 content。write ) #応答を変数に書き込むメソッドを設定します

c。 実行 ( )

c。 閉じる ( )

コンテンツ=コンテンツ。 getvalue ( )

'' 'Parsimコード' ''

試してください :

カルマ=コンテンツ[コンテンツ。 インデックス ( '<karma>' ) + 7 :コンテンツ。 インデックス ( '</ karma>' ) ]



を除く :

カルマ= '*'



試してください :

評価=コンテンツ[コンテンツ。 インデックス ( '<rating>' ) + 8 :コンテンツ。 インデックス ( '</ rating>' ) ]



を除く :

評価= '*'





カルマ+ '/' +評価を返す



def callback_button ( self 、widget、event ) :



自己 。 callback_open ( self )



def callback_open ( self 、event、data = None ) :

'' 「クリックしてブラウザで開く」 ''

ノーム。 url_show (

'http://' +

__USER__。 replace ( '_' 、 '-' ) + #サブドメインのアンダースコアをハイフンに置き換えます

'.habrahabr.ru /'

)



def callback_about ( self 、event、data = None ) :

'' '標準GNOMEウィンドウの表示' ''

os 。 システム ( 'gnome-about' )



def callback_destroy ( self 、applet ) :

'' 'オブジェクトを破壊する' ''

デル・ セルフ 。 アプレット





実際、これはアプレットの最も興味深い部分です。 __init__ ()コンストラクターメソッドはオブジェクトを初期化し、 __init_popupmenu()メソッドは[開く]および[ バージョン情報 ]コマンドをコンテキストメニューに追加し、対応するコールバックメソッドを設定します。 get_info()メソッドはサーバーから応答を受け取り、カルマと強さの大切な数のためにそれを処理します。 このような簡単なタスクで特別なxmlパーサーを使用するのは愚かなことなので、単純なbydcoderの方法で行います。



def applet_factory ( applet、iid ) :



MyApplet (アプレット、iid )

真を 返す



def main ( args ) :



if len ( sys。argv ) == 2 および sys 。 argv [ 1 ] == 'run-in-window' :



window = gtk。 ウィンドウ ( gtk。WINDOW_TOPLEVEL )

ウィンドウ。 set_title ( 'うまくいく!' )

ウィンドウ。 接続 ( 'destroy' 、 gtk。main_quit )

アプレット= gnomeapplet。 アプレット ( )

applet_factory (アプレット、 なし )

アプレット。 親 (ウィンドウ)

ウィンドウ。 show_all ( )

gtk。 メイン ( )

sys 終了 ( )



elif len ( sys。argv ) == 2 および sys 。 argv [ 1 ] == 'help' :

'' 'パラメータによるヘルプの出力' ''

印刷 '' '

--run-in-window-gnome-panelから独立してアプレットを実行

--help-このメッセージを表示する ' ' '



その他 :



gnomeapplet bonobo_factory ( 'OAFIID:GNOME_MyApplet_Factory' 、

MyApplet .__ gtype__、

「私のアプレット」 、

'1.0' 、

applet_factory )







__name__ == '__main__'の場合 :

main ( sys。argv )





これらの関数は、ほとんどのPythonアプレットで同じです。bonobo_factoryメソッドに渡された引数を自分のものに変更するだけです。

また、便利な点が1つあります。スクリプトに--run-in-windowパラメーターを渡すと、アプレットは別のウィンドウで実行されるため、デバッグ時に非常に役立ちます。



まあ、それがすべてのようです。 しかし、いいえ-アプレットは書かれていますが、gnomeアプレットのリストにはありません。 これを修正するには、次のようなディレクトリ/ usr / lib64 / bonobo / serversにファイル(この場合はgnomeMyAppletFactory.serverという名前を使用できます)を配置する必要があります。



< oaf_info >

< oaf_server iid = 'OAFIID:GNOME_MyApplet_Factory' type = 'exe' location = '/home/vlad/applets/src/habrapplet.py' >

< oaf_attribute name = 'repo_ids' type = 'stringv' >

<アイテム値= 'IDL:Bonobo / GenericFactory:1.0' / >

<アイテム値= 'IDL:Bonobo /不明:1.0' / >

< / oaf_attribute >

< oaf_attribute name = 'name' type = 'string' value = 'My Applet' / >

< oaf_attribute name = 'description' type = 'string' value = 'Show your karma and ratio' / >

< / oaf_server >



< oaf_server iid = 'OAFIID:GNOME_MyApplet' type = 'factory' location = 'OAFIID:GNOME_MyApplet_Factory' >

< oaf_attribute name = 'repo_ids' type = 'stringv' >

<アイテム値= 'IDL:GNOME / Vertigo / PanelAppletShell:1.0' / >

<項目値= 'IDL:Bonobo / Control:1.0' / >

<アイテム値= 'IDL:Bonobo /不明:1.0' / >

< / oaf_attribute >

< oaf_attribute name = 'name' type = 'string' value = 'My First Applet' / >

< oaf_attribute name = 'name-ru' type = 'string' value = 'Habrapplet' / >

< oaf_attribute name = 'description' type = 'string' value = 'Show your karma and ratio' / >

< oaf_attribute name = 'description-ru' type = 'string' value = 'Displays your karma and habrasil' / >

< oaf_attribute name = 'panel:category' type = 'string' value = 'Utility' / >

< oaf_attribute name = 'panel:icon' type = 'string' value = 'computer.png' / >

< / oaf_server >

< / oaf_info >




スクリプトへのパスを独自のものに変更し、 chmod + xを使用してその実行を許可することを忘れないでください。



良いコーディング、%ユーザー名%!



ps素材の準備では、 highlight.hohli.comリソースが使用されました。



All Articles