HabraKarma-S60用のPythonアプリケーションの作成

画像 s60向けのPythonに対する欲求開発し、アプリケーションの作成方法を学び始めた後、すばらしいプログラミング言語pythonでsymbainのプログラミングを引き続き理解していきたいと思います。



今回は、何か有用なことを行います。つまり、カルマを表示するアプリケーションを作成します。 表示するだけでなく、すべての「ウィンドウ」の上に、カルマ値と前の値との差があるプレートを表示します。 さらに、プログラムはカルマが上昇すると勝利のゴングを、下降すると絶望の叫びを発表します。 さらに、サーバーとして起動します。つまり、実行中のプログラムのリストには表示されません。



プロセスよりも結果に興味がある人のために、記事の最後にようこそ。 完成したアプリケーションHabraKarma 1.0見つかります!!!



今回は、プログラムのすべての行についてコメントしません。 私はあなたが少なくともPythonに少し慣れていて、 ドキュメントを読んで、少なくとも私の以前の記事から何かを理解できることを意味します。



仕事の一般原則



プログラム自体は、2つの部分で構成されます。すべての作業を行うサーバー自体と、サーバーの構成、起動、停止を行うGUIです。



サーバー自体は、e32モジュールのstart_server関数によって起動されます。 この関数にはパラメーターが1つだけあります-サーバーとして実行する必要があるPythonスクリプトへのフルパスです。 はい、はい、すべてがとてもシンプルですが、いくつかの制限があります。



サーバーはバックグラウンドで実行されているため、UIを担当するappuifwモジュールを使用できません。 ただし、すべての「ウィンドウ」の上に画像を表示できるtopwindowモジュールを使用して作業の結果を示すため、これも必要ありません。 さらに、globaluiと呼ばれる別のモジュールにアクセスできます。これにより、すべての「ウィンドウ」の上にさまざまな要求、警告、通知などを表示することもできます。これも使用して、サーバーの起動と停止の事実を示します。



別の制限は、アプリケーションフォルダーにあるファイルにアクセスできないことです(x:/ private / UID)。 したがって、さまざまなマルチメディアファイル、設定ファイルを使用する場合、これを中立な場所、たとえばx:/ system / data / AppNameフォルダーに配置する必要があります。 このフォルダには「非表示」属性があるため、そこに配置された写真はギャラリーに表示されず、ライブラリのオーディオファイルに表示されます。



別の問題は、メインプログラムからのサーバーの「分離」です。 つまり、開始することはできますが、実行中かどうかを確認したり、標準モジュールを使用して停止したりすることはできません。 私たちのプログラムでは、次のように進めます。



サーバーは、起動時に、ドライブDのルートにhabra_flagというファイルを作成します。サーバーがシャットダウンすると、このファイルは削除されます。 次に、シェルを実行するときに、探しているファイルが存在するかどうかを確認します。 はいの場合、サーバーが稼働していると見なします。 さらに、サーバーを停止する機能が必要です。 これを行うには、このファイルに何かを書き込みますが、サーバー上でループでチェックします。 ファイルの長さがゼロより大きい場合、作業を停止します。



habra_flagファイルを書き込むドライブDの種類を尋ねられる場合があります。 これは小さなボリュームのRAMディスクで、再起動時にクリアされます。 これを使用して、1石で2羽の鳥を殺します。電話を再起動すると、サーバーが手動で終了し、フラグ付きのファイルが消え、RAMディスク上のファイルシステムのパフォーマンスが向上します。 サーバーとのより複雑な相互作用には、ソケットを使用できます。



UIを書く



プログラムアイコンを「クリック」することで起動されるアプリケーションの面は、 このwiki記事でほぼ完全に説明されているFormクラスになります 。 次のようになります。



画像



そして、ここに私のコメント付きのプログラムコード自体があります:



  1. #coding:utf-8
  2. appuifw インポート から *
  3. e32をインポート
  4. 輸入 OS
  5. #設定ファイル、メディアファイルなどが含まれるフォルダー
  6. data_path = osgetcwd [ 0 ] + u ': \\システム\\データ\\ HabraKarma \\ '
  7. クラス Main:
  8. def __init__ self
  9. アプリ。 screen = 'normal'
  10. #辞書である設定ファイルを読み取り、
  11. #repr経由で愚かに保存:)
  12. 自己settings = eval open data_path + 'set.dat' read
  13. #フォームのフィールドのリスト、保存された値をそのフィールドに挿入します。
  14. 自己フィールド = [
  15. u 'Habrauser''text'self。settings [ 'user' ]
  16. u "自動更新(最小)"'number'self。settings [ 'time' ]
  17. u "サウンドを有効にしますか?"'combo' [ u 'Yes' 、u 'No' ]int self。settings [ 'sound' ] ))
  18. u "違いを数える"'combo' [ u '仕事の始まり' 、u '最後の更新以来' ]int self。settings [ 'diff' ] ))
  19. u "Position X"'number'self。settings [ 'X' ]
  20. u "Position Y"'number'self。settings [ 'Y' ]
  21. ]
  22. #フラグ付きのフォームを作成
  23. 自己form = Form self。fields、flags = FFormDoubleSpaced | FFormEditModeOnly
  24. #フォームから値を保存する関数を定義する
  25. 自己フォーム save_hook = self 保存する
  26. #サーバーが既に実行されている場合、メニューは「停止」になり、その逆も同様です。
  27. osの 場合パス 存在する u 'd: \\ habra_flag'
  28. 自己フォーム menu = [ u 'Stop'self。stop ]
  29. その他
  30. 自己フォーム menu = [ u 'Run'self。start_server ]
  31. #フォームを「実行」します。つまり、画面に表示されるまで
  32. #そこから抜け出すことはできません。
  33. 自己フォーム 実行
  34. #フォームを終了した後、サーバーが実行されているかどうかを確認し、開始を提案します
  35. osで ない 場合パス 存在する u 'd: \\ habra_flag'
  36. if query u 'Run?''query'
  37. 自己start_server
  38. def start_server self
  39. #実際にサーバー起動機能
  40. 自己フォーム menu = [ u 'Stop'self。stop ]
  41. e32。 start_server data_path + 'server.py'
  42. def stop self
  43. #サーバー停止機能。
  44. 自己フォーム menu = [ u 'Run'self。start_server ]
  45. open u 'd: \\ habra_flag''w' 書き込み 'stop'
  46. def save self 、arg = None
  47. #フォームから値を取得し、設定ファイルに保存します。
  48. 自己設定 [ 'ユーザー' ] = arg [ 0 ] [ 2 ]
  49. 自己設定 [ '時間' ] = arg [ 1 ] [ 2 ]
  50. 自己設定 [ 'サウンド' ] = arg [ 2 ] [ 2 ] [ 1 ]
  51. 自己設定 [ 'diff' ] = arg [ 3 ] [ 2 ] [ 1 ]
  52. 自己設定 [ 'X' ] = arg [ 4 ] [ 2 ]
  53. 自己設定 [ 'Y' ] = arg [ 5 ] [ 2 ]
  54. open data_path + 'set.dat''w' 書き込み repr self。settings
  55. 真を 返す
  56. a =メイン




サーバーを書くことは残っています:)





  1. #-*-コーディング:utf-8-*-
  2. 輸入 OS
  3. e32をインポート
  4. インポートシステム
  5. #エラーをファイルにリダイレクトします。
  6. sys stderr = open 'd: \\ err.txt''w'
  7. globalui ui として インポート
  8. topwindowをインポート
  9. グラフィックのインポート から *
  10. urllibを インポート する
  11. オーディオをインポートする
  12. open u 'd: \\ habra_flag''w' 書き込み ''
  13. data_path = osgetcwd [ 0 ] + u ': \\システム\\データ\\ HabraKarma \\ '
  14. #開始したことを示しています。
  15. ui。 global_note u 'Habrastart!'
  16. クラス Habra:
  17. def __init__ self
  18. #画像を開く
  19. 自己habr_img =画像。 オープン data_path + 'habr.png'
  20. 自己update_img =イメージ。 オープン data_path + 'update.png'
  21. #設定を読む
  22. 自己settings = eval open data_path + 'set.dat' read
  23. 自己last_karma = eval open data_path + 'karma.dat' read
  24. #オープンサウンド
  25. 自己bad_sound =オーディオ。 オープン data_path + 'bad.wav'
  26. 自己good_sound =オーディオ。 オープン data_path + 'good.wav'
  27. 自己ループ = True
  28. #TopWindowウィンドウを作成
  29. 自己top = topwindow。 TopWindow
  30. #丸めを示す
  31. 自己トップcorner_type = 'corner5'
  32. 自己トップサイズ = 170、35
  33. #設定ファイルから位置を設定
  34. 自己トップposition = self。settings [ 'X' ]self。settings [ 'Y' ]
  35. 自己トップ表示
  36. 自己karma_screen
  37. 自己メインループ
  38. def stop self
  39. 自己ループ = False
  40. 自己トップ非表示
  41. def karma_screen self
  42. #更新するために呼び出される関数
  43. 自己update_screen
  44. e32。 ao_sleep 0.2
  45. #harba apiで情報を取得
  46. data = urllib urlopen 'http://habrahabr.ru/api/profile/' + self。settings [ 'user' ] 読む
  47. #たぶんつまずいたが、これを引っ張りたくない
  48. #xmlを解析するためのケースライブラリ
  49. karma = float data。split '<karma>' [ 1 ] 。split '</ karma>' [ 0 ]
  50. #新しいカルマと古いカルマを比較し、
  51. #状況に応じて、テキストを収集し、色を指定します
  52. #設定で設定されている場合、サウンドを再生
  53. 自己の 場合last_karma <カルマ:
  54. karma_diff = u '(+' + str abs self。last_karma -karma + u ')'
  55. karma_color = 0x009f31
  56. 自己で なければ設定 [ 'サウンド' ]
  57. 自己good_sound プレイ
  58. エリフセルフlast_karma >カルマ:
  59. karma_diff = u '(-' + str abs self。last_karma -karma + u ')'
  60. karma_color = 0xc30202
  61. 自己で なければ設定 [ 'サウンド' ]
  62. 自己bad_soundプレイ
  63. その他
  64. karma_diff = u ''
  65. karma_color = 0xffffff
  66. 自己の 場合設定 [ 'diff' ]
  67. 自己last_karma =カルマ
  68. open data_path + 'karma.dat''w' 書き込み repr karma
  69. #ここで、幅のピクセル数がテキストを占めることがわかります
  70. karma_width = self imgmeasure_text unicode karma [ 0 ] [ 2 ]
  71. diff_width = self imgmeasure_text karma_diff [ 0 ] [ 2 ]
  72. #そして技術の問題:)
  73. 自己img =イメージ。 新規 45 + karma_width + diff_width、 35
  74. 自己トップsize = self。img。size [ 0 ]35
  75. 自己imgテキスト 35、25 ユニコード karma
  76. 自己imgテキスト 35 + karma_width + 5、25 、karma_diff、fill = karma_color
  77. 自己imgblit self。habr_img
  78. 自己トップadd_image self。img 0、0
  79. def update_screen self
  80. #これは更新中に表示されます
  81. 自己img =イメージ。 新規 165、35
  82. 自己トップsize = self。img。size [ 0 ]35
  83. 自己imgblit self。update_img
  84. 自己imgテキスト 35、25 、u '更新済み'
  85. 自己トップadd_image self。img 0、0
  86. def mainloop self
  87. #そしてメインサーバーループを開始
  88. interval = self 設定 [ '時間' ] * 60
  89. カウント= 0
  90. 自己 ながらループ
  91. #注文された場合、サーバーを停止
  92. 開いている 場合 u 'd: \\ habra_flag' 読み取り
  93. os削除 u 'd: \\ habra_flag'
  94. ui。 global_note u 'Habrastop!'
  95. 自己ループ = False
  96. カウント+ = 1
  97. #時間が来たら、カルマを公開します。
  98. カウント>間隔の場合
  99. カウント= 0
  100. 自己karma_screen
  101. e32。 ao_sleep 1
  102. habr = Habra




sisですべてを収集し、カルマを見ることが残っています:)



ソースは、写真、音声、アイコンと一緒にここから撮影できます。 シンボルのアセンブリオプションで、次のように記述します。

--extrasdir =データ--lang = RU --icon = icon_path



そして結果を取ります...



したがって、symbain 9.xのHabraKarmaアプリケーションを紹介します

アプリケーションをインストールし、ユーザー名を入力し、更新時間、ウィンドウの位置を設定します。 これでサーバーを起動でき、すべてのウィンドウの上部にカルマが表示されます。 その後、プログラムを閉じることができます。プログラムを再度入力してオフにするまで、ウィンドウは残ります。

こちらからダウンロード(sis、56 kb、署名不要)

動作するには、バージョン1.9.7以上のPythonランタイムが必要であることを忘れないでください( ダウンロード )。

Pythonとプログラムを同じドライブに入れてください!



All Articles