プラスモイドは、KDE4デスクトップのデスクトップウィジェットです。 時計、システムトレイ、プロセッサロードモニター、天気予報ウィンドウなど、デスクトップに表示されるコントロールはすべてプラズモイドです。
このレッスンでは、特定のサーバーにリクエストを送信して結果を表示できるプラズモイドの作成について説明します。 サーバーはユーザー認証を必要とするため、KWalletにユーザーアカウントデータを保存するプロセスについて説明します。 開発言語:Python。
例として、1人のイルクーツクオペレーターの携帯電話の残高を確認するプラズモイドが作成されました。 データを受信するには、 ISSAにログインし、ページからデータを取得してログアウトする必要があります。
パッケージ
各プラスモイドは、zipアーカイブにパッケージ化されたファイルのセットです。 このレッスンでは、プラズモイドをbwc-balance-plasmoidと呼びます。 すべてのプロジェクトファイルが保存される同じ名前のディレクトリを作成しましょう。
./contents/
./contents/code/
./contents/code/main.py
./metadata.desktop
metadata.desktop
metadata.desktopには、プラズモイドに関するすべてのメタデータ(たとえば、名前、作成者、または記述されているプログラミング言語)が含まれています。
[Desktop Entry]
Encoding=UTF-8
Name=BWC Balance
Name[ru]= BWC
Type=Service
ServiceTypes=Plasma/Applet
Icon=phone
X-Plasma-API=python
X-Plasma-MainScript=code/main.py
X-KDE-PluginInfo-Author=SvartalF
X-KDE-PluginInfo-Email=self@svartalf.info
X-KDE-PluginInfo-Name=bwc-balance
X-KDE-PluginInfo-Version=0.1
X-KDE-PluginInfo-Website=http://bitbucket.org/svartalf/bwc-balance-plasmoid/
X-KDE-PluginInfo-Category=Online Services
X-KDE-PluginInfo-Depends=
X-KDE-PluginInfo-License=GPL
X-KDE-PluginInfo-EnabledByDefault=true
すべてのフィールドの目的はかなり明白なので、ここで終わりではありません。
main.py
メインのplasmoidコードはmain.pyファイルにあります。
システムライブラリをインポートすると、ウィジェットを作成できなくなります。
Copy Source | Copy HTML
- PyQt4.QtCore インポート から *
- PyQt4.QtGui インポート から *
- PyKDE4.kio から インポート *
- PyKDE4.kdeui インポート から *
- PyKDE4.kdecore インポート から *
- PyKDE4.plasma import Plasma から
- PyKDE4 から plasmascriptをインポート
- PyKDE4.solid から Solidをインポート
プラズモイドクラスを作成します。
Copy Source | Copy HTML
- クラス BWCBalancePlasmoid (plasmascript.Applet):
- def __init__ (self、parent、args = None):
- plasmascript.Applet。 __init__ (自己、親)
- def init (自己):
- 「」「初期化設定」「」
- #Plasmoidにはユーザー設定があります
- self .setHasConfigurationInterface(True)
- self .setAspectRatioMode(Plasma.IgnoreAspectRatio)
- self .theme = Plasma.Svg(自己)
- self .theme.setImagePath( "widgets / background" )
- self .setBackgroundHints(Plasma.Applet.DefaultBackground)
- #プラスモイド要素の位置
- self .layout = QGraphicsLinearLayout(Qt.Horizontal、 self .applet)
- #出力のラベル
- self .label = Plasma.Label( self .applet)
- self .label.setText( "0.0" ) #最初は0にする
- #ラベルをレイアウトに追加
- self .layout.addItem( self .label)
- self .applet.setLayout( self .layout)
- #プラスモイドのサイズを変更します
- 自己のサイズ変更( 50、50 )
クラスを記述した後、Plasmaが呼び出してプラスモイドを作成する小さな関数を追加します。
Copy Source | Copy HTML
- def CreateApplet (親):
- Return BWCBalancePlasmoid(親)
テスト用に、plasmoidviewerプログラムがあります。
svartalf〜$ plasmoidviewer bwc-balance-plasmoid
結果は非常に美しいですが、機能的なウィンドウではありません。
プラスモイドの準備ができたら、zipアーカイブにパックします。
結果のファイルは、次のコマンドを使用してシステムにインストールされます。
plasmapkg -i bwc-balance-plasmoid.zip
そして削除:
plasmapkg -r bwc-balance-plasmoid.zip
設定
ユーザー設定の実装に取り組みます。
Qt Designerでは、2つの入力フィールドを持つQDialogに基づいてダイアログを作成し、settings_ui.uiに保存します
結果の.uiファイルは.pyファイルに変換されます。 これが基本設定ダイアログになります。
pyuic4 settings_ui.ui -o settings_ui.py
作成されたダイアログは、設定フォームに継承されます。 フォームを初期化するとき、フィールドにKWalletの既存のデータを入力しようとします。
Copy Source | Copy HTML
- クラス SettingsDialog (QWidget、Ui_SettingsDialog):
- def __init__ (self、parent = None):
- QWidget。 __init__ (自己)
- self .parent = parent
- self .setupUi(自己)
- #ローカルウォレットを開く
- self .wallet = KWallet.Wallet.openWallet(KWallet.Wallet.LocalWallet()、 0 )
- 自己 .walletの場合 :
- #パスワードを保存するための「フォルダ」を選択します
- self .wallet.setFolder( "bwc-balance-plasmoid" )
- 自己で はない場合 .wallet.entryList()。isEmpty():
- phone = str ( self .wallet.entryList()。first())
- パスワード= QString()
- #電話番号のパスワードを読み取る
- self .wallet.readPassword(電話、パスワード)
- #そして、ダイアログフィールドにこのデータを入力します
- self .textPhone.setText(電話)
- self .textPassword.setText( str (パスワード))
- def get_settings (self):
- return { "phone" : str ( self .textPhone.text())、 "password" : str ( self .textPassword.text())}
KWallet.Wallet.openWallet()関数は、3番目のオプションのOpenTypeパラメーターを受け入れます:同期/非同期ウォレットオープンモード
非同期モードで開くときは、関数の戻り値を確認する必要があり、それがNoneでない場合は、ウォレットデータを処理するスロットにwalletOpened()信号を接続します。
この場合、ウォレットは同期モードで開かれ、そこからデータが読み取られ、ダイアログフィールドに入力されます。
次に、ユーザーの要求に応じてこのダイアログを表示し、入力したデータを保存する必要があります。
init()のplasmoidクラスに次の行を追加しましょう。
Copy Source | Copy HTML
- #ここに設定ダイアログのオブジェクトが保存されます
- self .settings_dialog =なし
- #そして、これらは設定そのものです
- self .settings = { "phone" :なし、 "password" :なし}
- #プラスモイドをロードするとき、非同期モードでウォレットを開きます
- #そのため、ユーザーはすぐにプラスモイドとアクセス許可の申し出を見ることになります
- #このウォレットアプリへ
- self .wallet = KWallet.Wallet.openWallet(KWallet.Wallet.LocalWallet()、 0、1 )
- 自己 .walletの場合 :
- self .connect( self .wallet、SIGNAL( "walletOpened(bool)" )、 self .walletOpened)
self.walletOpened()関数で、ウォレットを開き、ユーザーデータを読み取り、タイマーを開始します。これにより、一定期間後に情報が更新されます。
対応するメニュー項目が選択されたときに呼び出される関数をBWCBalancePlasmoidクラスに追加します。
Copy Source | Copy HTML
- def showConfigurationInterface (self):
- #対話のオブジェクトを作成する
- self .settings_dialog = SettingsDialog(self)
- #標準のダイアログフォームに埋め込みます
- dialog = KPageDialog()
- dialog.setFaceType(KPageDialog.Plain)
- dialog.setButtons(KDialog.ButtonCode(KDialog.Ok | KDialog.Cancel))
- page = dialog.addPage( self .settings_dialog、u " ISSA 設定" )
- #スロットを信号に接続します
- self .connect(ダイアログ、SIGNAL( "okClicked()" )、 self .configAccepted)
- self .connect(ダイアログ、SIGNAL( "cancelClicked()" )、 self .configDenied)
- dialog.resize(350、200)
- #対話を表示
- dialog.exec_()
関数self.configAccepted()およびself.ConfigDenied()は、ダイアログの「OK」および「キャンセル」ボタンが押されると呼び出されます。 [キャンセル]をクリックすると、アクションを実行する必要がないため、ロジックconfigAccepted()を記述するだけです。
Copy Source | Copy HTML
- def configAccepted (self):
- #プログラムのデータを更新する
- self .settings = self .settings_dialog.get_settings()
- #そしてそれらをあなたの財布に保存する
- ウォレット= KWallet.Wallet.openWallet(KWallet.Wallet.LocalWallet()、 0 )
- ウォレットの場合 :
- wallet.hasFolderでない場合( 「bwc-balance-plasmoid」 ):
- wallet.createFolder( "bwc-balance-plasmoid" )
- wallet.setFolder( "bwc-balance-plasmoid" )
- wallet.entryList()のeの場合:
- wallet.removeEntry(e)
- wallet.writePassword( self .settings [ "phone" ]、 self .settings [ "password" ])
設定を変更した後、更新タイマーを開始し、初めて機能するまで待機しないように、データの読み込みを行います。
データ更新
データが1時間に1回更新されることに同意します。 まず、ロードするデータに応じてタイマーを作成します。 BWCBalancePlasmoidクラスのinit()関数に次を追加します。
Copy Source | Copy HTML
- self .timer = QTimer()
- self .connect( self .timer、SIGNAL( "timeout(bool)" )、 self .loadBalance)
ここでは、QTimer()クラスのオブジェクトを作成し、そのtimeout()シグナルをloadBalance()関数に接続します。
プラズモイドをロードしてタイマーを開始した後にのみ残ります。
Copy Source | Copy HTML
- self .timer.start( 1000 * 60 * 60 ) #時間はミリ秒で示されます
データの読み込み
最初、データはurllib2.build_opener()およびurllib2.Request()を介してロードされましたが、この方法には次の欠点がありました。
- 主観的にダウンロードに時間がかかった
- 同期モードで実行されたため、操作中にプラスモイドはユーザーのアクションに応答しませんでした
この問題は、非同期モードで動作するKIOネットワーク関数、つまりstoredGet()およびstoredHttpPost()を使用して解決されました。
これらの関数を使用するプロセスについては説明しません。GETおよびPOSTリクエストの例を示します。
ゲット
Copy Source | Copy HTML
- self .job = KIO.storedGet(KUrl( "http://example.com/account")、KIO.Reload、KIO.HideProgressInfo )
- self .job.addMetaData( "User-Agent" 、 "User-Agent:bwc-balance-plasmoid" )
- self .connect( self .job、SIGNAL( "result(KJob *)" )、 self ._get_result)
投稿
Copy Source | Copy HTML
- self .job = KIO.storedHttpPost(QByteArray(urlencode({ 'phone' : self .settings.get( "phone" )、 'password' : self .settings.get( "password" )}))\
- KUrl( "</ code> <code> http://example.com/ </ code> <code> login" )、KIO.HideProgressInfo)
- self .job.addMetaData( "Content-type" 、 "Content-Type:application / x-www-form-urlencoded" )
- self .job.addMetaData( "Accept" 、 "Accept:text / plain" )
- self .job.addMetaData( "User-Agent" 、 "User-Agent:bwc-balance-plasmoid" )
- self .connect( self .job、SIGNAL( "result(KJob *)" )、 self ._get_result)
self._get_result()関数を記述するためだけに残ります:
Copy Source | Copy HTML
- def self ._get_result( self 、job):
- print job.data() #受け取った回答で何かをする
まとめ
プラズモイド、KWallet、およびKIOネットワーク機能の設定を操作するプロセスがレビューされました。 この例が、KDE Desktopの有用なプラスモイドの数をすぐに増やすのに十分であることを願っています。 熱いプラズマ!
完全なplasmoidコードはここにあります 。