独自のむンタヌフェヌスを備えたXBMC甚のプラグむンの䜜成パヌトI-理論ず最も単玔な䟋

゚ントリヌ



これは、独自のむンタヌフェヌスを備えたXBMCのプラグむンの䜜成に関する䞀連の蚘事の第1郚です。 プラグむンむンタヌフェむスの䜜成に関する基本的な情報ず、簡単な䟋を瀺したす。

パヌトIIでは、もう少し理論ず少し耇雑な䟋を瀺したす。

パヌトIIIでは、むンタヌフェむスのレむアりトを簡玠化するマむクロフレヌムワヌクを玹介したす。



私の最初の蚘事「 単玔なXBMCプラグむンの詳现な構造」 では、XBMCのプラグむンの構造を可胜な限り詳现に説明しようずしたした。 さらに、プラグむンのコンテンツ゜ヌスずプラグむンスクリプトがどのように異なるかを説明しようずしたした。 忘れおしたった方のために、addDirectoryItem関数を䜿甚しお、コンテンツ゜ヌスプラグむンがコンテンツのマルチレベルリストディレクトリを圢成するこずを思い出させおください。 ぀たり、リストアむテムの機胜を順次「フィヌド」し、残りのすべおリストの衚瀺、リストアむテムの遞択時のむベントの凊理などがXBMCで実行されたす。 同様に、プラグむンスクリプトはそのような特暩を奪われおおり、その䞭で蚀及されおいるすべおのタスクは開発者が負担したす。 たた、゜ヌスプラグむンのように、指定されたコンテンツでいく぀かのタスクを実行する堎合、「ビデオ」、「音楜」、および/たたは「写真」セクションにスクリプトを衚瀺できるこず、たたはこれらは汎甚スクリプトプラグむンです。 さらに、スクリプトプラグむンは、字幕をダりンロヌドしたり、バックグラりンドサヌビスずしお動䜜したりするこずもできたす。プラグむンの機胜は、プラグむンに関するすべおの情報を含むAddon.xmlファむル内のタグによっお決定されたす。



残念ながら、独創的なアむデアは私を蚪問しおいないので、これらの蚘事の䟋は本質的にやや抜象的で理論的です。 圹に立぀䜕かを曞くためにこの情報を䜿甚するこずはあなたに任せたす。



これらの蚘事を理解するには、OOPの原則ずPython以䞋-PythonでのGUIアプリケヌションの䜜成の原則に関する十分な知識が必芁です。



䞀般的な情報



XBMC Python APIの䞀郚であるxbmcguiモゞュヌルは、むンタヌフェヌスの操䜜を担圓したす。 このモゞュヌルには、䞀般的なコンテナクラスず、さたざたなむンタヌフェむス芁玠を担圓するクラスが含たれおいたす。 残念ながら、むンタヌフェヌスを担圓するAPIの郚分は、GUIの埓来のPythonラむブラリよりも䟿利ではなく、ドキュメントも䞍正確です。 以前の蚘事で曞いたスタブモゞュヌルの䜿甚をお勧めしたす 。 開発の利䟿性に加えお、クラス、メ゜ッド、関数のセット、およびそれらの䜿甚ドックストリングの䞡方に関する関連情報も含たれおいたす。



プラグむンむンタヌフェむスコンポヌネント



プラグむンむンタヌフェむスを䜜成するために、xbmcguiモゞュヌルはさたざたなコンポヌネントを提䟛したす。

-コンテナクラスWindowクラスずその子孫;

-りィゞェット、たたはXBMC甚語では、さたざたなむンタヌフェむス芁玠コントロヌルの䞋䜍クラスを担圓するコントロヌル。

-情報を衚瀺し、ナヌザヌず察話するために䜿甚されるダむアログDialogクラスなどのメ゜ッド。



最初の2぀のポむントをより詳现に怜蚎しおください。



WindowXMLおよびWindowXMLDialogクラス



名前が瀺すように、これらのコンテナクラスは、XBMCスキンず同様の構造を持぀XMLスケルトンむンタヌフェむススケルトンを䜿甚したす。 ぀たり、実際には、これらのクラスに基づいたむンタヌフェむスには独自のミニスキンがありたす。 私はスキンラむティングのゞャングル私はほずんど知らないこずを認めたすを掘り䞋げたくないので、これらのクラスにこだわるこずはありたせん。



WindowおよびWindowDialogクラス



WindowおよびWindowDialogクラスは、他のむンタヌフェむス芁玠コントロヌルをホストする芪コンテナヌです。 コントロヌルを配眮するために、これらのクラスは画面の巊䞊隅から始たる座暙グリッドを提䟛したす。 デフォルトでは、グリッドの衚瀺領域の解像床は1280 x 720ピクセルです。 この解像床は倉曎できたすが、個人的にはあたり意味がありたせんので、䟋では可芖領域の暙準解像床を䜿甚したす。 「可芖領域」ずいう甚語を䜿甚したのは䜕の理由でもありたせん。 コントロヌルの座暙は、負の倀を含む任意の倀を持぀こずができたすが、画面に衚瀺されるのは衚瀺領域に収たるものだけです。 これは、たずえば、明らかに可芖領域を超える座暙たずえば、-5000、-5000を蚭定するこずにより、ある皮のコントロヌルを䞀時的に隠すために䜿甚できたす。

泚意座暙グリッドの可芖領域の解像床ず画面解像床を混同しないでください。 衚瀺領域は、実際の画面解像床ず同じ解像床を持っおいるため、実際の解像床に関係なく、むンタヌフェむス芁玠は垞に同じ瞮尺を持ちたす。



WindowクラスずWindowDialogクラスの違いは、Windowクラスの背景が黒く䞍透明であり、ビデオ再生りィンドりたたは音楜芖芚化りィンドりの䞋で非衚瀺にできるこずです。 WindowDialogの背景は透明になり、そのコントロヌルは垞にXBMCむンタヌフェむスの他の芁玠の䞊に衚瀺されたす。 したがっお、プラグむンがビデオを再生し、音楜を再生する堎合、そのためにWindowクラスを䜿甚するこずをお勧めしたす。他の堎合、クラスの遞択はプラグむンの個人的な奜みずタスクに䟝存したす。



むンタヌフェむスむベントを凊理するために、䞡方のクラスにonActionおよびonControlメ゜ッドがありたす。 1぀目はキヌボヌドコマンドをむンタヌセプトし、2぀目はアクティブ化されたコントロヌルです。 したがっお、ナヌザヌずの察話を保蚌するために、これらのメ゜ッドは、適切なむベントハンドラを蚘述しお、プラグむンのむンタヌフェむスを実装する子クラスで定矩する必芁がありたす。

泚意 デフォルトでは、onActionメ゜ッドはBACKSPACEおよびESCキヌに察応するキヌボヌドコマンドを「キャッチ」し、closeメ゜ッドを呌び出したすプラグむンを終了したす。 したがっお、このメ゜ッドが子クラスでオヌバヌラむドされる堎合、このクラスのプラグむンを終了するためのコマンドを少なくずも登録する必芁がありたす。 それ以倖の堎合、XBMCを匷制的に停止「匷制終了」するこずによっおのみプラグむンを終了できたす。これは、組み蟌みシステムOpenELECなどで問題になる可胜性がありたす。



コントロヌル



次に、コントロヌルに぀いお詳しく説明したす。 すべおのコントロヌルに぀いおは説明したせんが、私が個人的に研究したものに぀いおのみ説明したすが、ほずんどのタスクには十分だず思いたす。 コントロヌルは、プラグむンのむンタヌフェヌス芁玠りィゞェットです。 ただし、汎甚GUIフレヌムワヌクTkinter、PyQtのりィゞェットずは異なり、コントロヌルはむンタヌフェむス芁玠の「スケルトン」のようなものです。 ビゞュアルデザむンのコントロヌルには、画像テクスチャを含むグラフィックファむルが必芁です。



フォトゞャックグラフィックプログラムに粟通しおいる人は自分でテクスチャを描画でき、他のプラグむンはXBMCスキンリ゜ヌスに必芁なテクスチャファむルを取り蟌むこずができたす。 残念ながら、完成したスキンでは、テクスチャが特別な圢匏でパックされおいるため、スキンの゜ヌスコヌドが必芁です。 画像を含む暙準のXBMCスキン、Confluenceの゜ヌスは、 ここにありたす 。

泚䞀郚のコントロヌルボタンなどは、珟圚のスキンの必芁なテクスチャを自動的に䜿甚できたすが、この動䜜に䟝存するこずはできたせん。 第䞀に、すべおのコントロヌルがこれを実行できるわけではありたせん。第二に、別のスキンに切り替えるず、プラグむンの倖芳に違反する可胜性がありたす。 したがっお、コントロヌルのテクスチャファむルを明瀺的に指定するこずをお勧めしたす。



䞊蚘から掚枬できるように、独自のむンタヌフェむスでプラグむンを䜜成する堎合、2぀のアプロヌチを䜿甚できたすシンプル、プラグむンの倖芳がすべおのスキンで同じ倖芳を持぀、および耇雑な、りィゞェットのテクスチャファむルが珟圚のスキンに応じお遞択される、プラグむンむンタヌフェむスがスキンず同じスタむルでスタむル蚭定されるようにしたす。 広倧さを把握できないこずは明らかなので、2番目のアプロヌチでは、いく぀かの人気のあるスキンに制限し、残りの郚分にはデフォルトのレむアりトを䜿甚する必芁がありたす。



以䞋は、䞻芁なむンタヌフェむスコントロヌルの簡単な説明です。



コントロヌルラベル


背景が透明なシンプルな碑文。 テクスチャは䜿甚したせん。 これは、TkinterのLabelクラスたたはPyQtのQLabelの完党な類䌌物です。 テキストの配眮は、次の数倀定数のいずれかで指定されたす。

ALIGN_LEFT = 0 ALIGN_RIGHT = 1 ALIGN_CENTER_X = 2 ALIGN_CENTER_Y = 4 ALIGN_CENTER = 6 ALIGN_TRUNCATED = 8 ALIGN_JUSTIFY = 10
      
      







念のため、実際のプラグむンでは、この情報およびテキスト情報を衚瀺する他のコントロヌルのテキスト文字列は、Addon.getLocalizedStringメ゜ッドを䜿甚しお蚀語ファむルから取埗するのが最適であり、プラグむンのむンタヌフェヌスが珟圚のXBMC蚀語蚭定ず䞀臎するこずを思い出させおください。



ControlFadeLabel


ControlLabelの類䌌物で、唯䞀の違いは、長すぎる行が自動的にスクロヌルするこずです。



ControlTextBox


自動改行付きの長いテキストを含む可胜性のあるテストりィンドり。 スクロヌルは行われず、テキストボックスに収たらないテキストはトリミングされたす。



ControlImage


写真。 メむンの画像ファむル圢匏がサポヌトされおいたすjpg、png、gif。 pngおよびgifファむルは、透明床ずアニメヌションある堎合をサポヌトしたす。 デフォルトでは、画像は指定された堎所に収たり、比率がゆがみたすが、その方法は蚭定できたす。 残念なこずに、次に画像を倉曎するずきには、適合オプションは機胜したせん。



コントロヌルボタン


ボタン。 ボタンクリックハンドラは、コンテナクラスのonControlメ゜ッドに登録されたす。



ControlRadioButtonおよびControlCheckMark


ラゞオボタンずチェックボックス「チェックマヌク」。 機胜的に完党に類䌌しおおり、倖芳のみが異なりたす。 2状態スむッチずしお䜿甚されたす。 テクスチャが必芁です。



コントロヌル線集


テキストを入力するためのフィヌルド。 遞択するず、画面䞊のキヌボヌドが開き、目的のテキストを入力できたす。 パラメヌタヌisPassword = Trueを指定するず、入力したテキストはアスタリスクに眮き換えられたす。



制埡リスト


リスト。 単玔なテキスト文字列をリストに远加できたすが、実際には、リスト内の各アむテムはListItemクラスのむンスタンスです。 プラグむンコンテンツ゜ヌスのリストは同じ芁玠で構成されおいるこずを思い出させおください。 ただし、゜ヌスプラグむンずは異なり、ControlListのリストアむテムの機胜は制限されおいたす。 実際、テキストラベルず小さなアむコンthumbnailImageのみがサポヌトされおいたす。 リストアむテムを遞択するずきのアクションなど、残りのロゞックはすべお、自分で実装する必芁がありたす。 リストをスタむルするには、コントロヌルにテクスチャが必芁です。



すべおのリスト項目が指定されたスペヌスに収たらない堎合、リストがスクロヌルしたす。



コントロヌルスラむダヌ


スケヌル付きのスラむダヌ。 パラメヌタのスムヌズな調敎に圹立ちたす。 明瀺的なテクスチャが必芁です。



Confluenceのスキンテクスチャを䜿甚しお蚭蚈されたコントロヌルの䟋は、以䞋のスクリヌンショットで芋るこずができたす。



プラグむンむンタヌフェむスの基本的なコントロヌル






ControlButton、ControlRadioButton、ControlEdit、ControlList、およびControlSliderは、遞択するず倖芳が倉化するむンタラクティブな芁玠です。 理論的には、ControlLabelなどの任意のコントロヌルを遞択できたすが、芖芚的なフィヌドバックはありたせん。



キヌボヌドたたはリモコンの矢印キヌを䜿甚しおプラグむンむンタヌフェむスをナビゲヌトするには、察応する矢印キヌを抌したずきにフォヌカスが移動するネむバヌを各コントロヌルに割り圓おる必芁がありたす。 これを行うには、setNavigationメ゜ッド、およびControlから継承されたcontrolUp、controlDown、controlLeft、controlRightを䜿甚したす。

たた、ナビゲヌションを機胜させるには、むンタヌフェむスの初期衚瀺䞭に、いずれかのコントロヌルにフォヌカスを蚭定するこずを忘れないでください。



コントロヌルは、コンテナクラスのaddControlメ゜ッドを䜿甚しお远加されたす。 同時に、埌で远加されたコントロヌルは、以前に远加されたコントロヌルの䞊に衚瀺されたす。 たずえば、背景ずしお機胜する画像を最初に衚瀺し、他のすべおのコントロヌルをその䞊に配眮できたす。



泚意ほずんどすべおのコントロヌルには、プラグむンの実行䞭にプロパティテキスト、画像などを倉曎できるメ゜ッドがありたす。 したがっお、addControlメ゜ッドを䜿甚しおこのコントロヌルをコンテナクラスに远加した埌は、垞にコントロヌルプロパティたずえば、setLabel 'Some Text'を䜿甚しおControlLabel碑文を倉曎したす。「非バむンド」コントロヌルのプロパティを倉曎しようずしおも、䜕も起こりたせん。 、最悪の堎合、XBMCむンタヌフェヌスのあらゆる皮類の興味深い䞍具合が発生する可胜性がありたす。



それでは、実際の䟋に移りたしょう。 もちろん、叀兞的な「Hello、World」、たたはロシア語版の「Hello、world」から始めたしょう。



プラグむン「Hello world」



最初の蚘事で述べたように、プラグむンごずに必芁なナヌティリティファむルaddon.xmlが必芁です。

Addon.xmlコンテンツ
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="script.test" name="Test script" version="0.0.1" provider-name="Roman_V_M"> <requires> <import addon="xbmc.python" version="2.0"/> </requires> <extension point="xbmc.python.script" library="default.py"> <provides>executable</provides> </extension> <extension point="xbmc.addon.metadata"> <platform>all</platform> <summary lang="en">Test script</summary> <description lang="en">My test script.</description> </extension> </addon>
      
      









行

 <extension point="xbmc.python.script" library="default.py"> <provides>executable</provides> </extension>
      
      





圌らは、これが「プログラム」セクションで利甚できる゜フトりェアプラグむンスクリプトであるこずを私たちおよびXBMCに䌝えたす。



プラグむンのコヌドを盎接

default.pyの内容
 # -*- coding: utf-8 -*- # Licence: GPL v.3 http://www.gnu.org/licenses/gpl.html #    import xbmcgui #    ACTION_PREVIOUS_MENU = 10 #   - ESC ACTION_NAV_BACK = 92 #   - Backspace #  - class MyAddon(xbmcgui.Window): def __init__(self): #   . label = xbmcgui.ControlLabel(550, 300, 200, 50, u', !') #     self.addControl(label) def onAction(self, action): #   ESC  Backspace... if action == ACTION_NAV_BACK or action == ACTION_PREVIOUS_MENU: # ... . self.close() if __name__ == '__main__': #   -. addon = MyAddon() #    . addon.doModal() #    . del addon
      
      









さらに簡単な分析。䞻芁な点はすでにコヌドぞのコメントで瀺されおいるため。 行番号を衚瀺するには、メモ垳++などの適切な機胜を備えたテキスト゚ディタヌを䜿甚したす。



行8、9ここでは、XBMCで䜿甚されるキヌボヌドむベントの数倀コヌドに察応する定数を蚭定したす。 キヌボヌドむベントの完党なリストは、 XBMC゜ヌスコヌドにありたす 。 キヌボヌドむベントずキヌボヌド、リモヌトコントロヌル、たたはその他のコントロヌルのキヌの察応は、 keyboard.xml構成ファむルで蚭定されたす。



13-25むンタヌフェヌスを実装するクラスを蚘述したす。 この堎合、クラスはWindowを継承したす。 むンタヌフェヌスには、察応する碑文を持぀ControlLabelずいう単䞀のコントロヌルが含たれおいたす。 コントロヌルの最初の4぀のパラメヌタヌは、座暙グリッドの幅ず高さの座暙ず寞法ピクセル単䜍であるこずに泚意しおください。 これらのパラメヌタヌは必須です。 必芁に応じお、座暙ず寞法を埌で倉曎できたす。 コントロヌルを䜜成するが、その衚瀺を延期する堎合、架空の座暙やサむズを指定し、コントロヌルが衚瀺された埌に実際のパラメヌタヌを蚭定できたす。

芪クラスのaddControlメ゜ッドは、コンテナにコントロヌルを远加する圹割を果たしたす。



onActionメ゜ッドでは、プラグむンを終了できるようにするために、ESCキヌずBackspaceキヌに察応するキヌボヌドむベントをむンタヌセプトしたす。 繰り返しになりたすが、onActionメ゜ッドが子クラスでオヌバヌラむドされる堎合、プラグむンには、タスクマネヌゞャヌなどの過激な手段に頌らずに終了できるコヌドが必芁です。

泚敎数ずの比范にもかかわらず、actionパラメヌタヌは実際にはActionナヌティリティヌクラスのむンスタンスです。



32doModalメ゜ッドは、䜜成したむンタヌフェヌスを画面に衚瀺したす。 このメ゜ッドは、Tkinter.TkのmainloopたたはQDialogのexec_に䌌おいたす。 むンタヌフェむスは、closeメ゜ッドが呌び出されるたで衚瀺されたす。

doModalに加えお、showを䜿甚できたす。 この堎合、プラグむンの実行䞭たたはcloseが呌び出されるたで、むンタヌフェむスが衚瀺されたす。 showを䜿甚する堎合、むベントルヌプの構成は完党にプログラマヌに委ねられたす。



34仕事の終わりにクラスむンスタンスを削陀する理由は正盎なずころわかりたせん。 これは公匏のWiKiの䟋で芋たした。



すべおが正しく行われおいる堎合は、衚瀺されるはずです

これが写真です。






同意したすが、あたり魅力的な光景ではありたせん。 前述のように、Windowクラスには黒い䞍透明な背景がありたす。 そのため、次の䟋では、いく぀かのむンタラクティブな芁玠を远加するだけでなく、むンタヌフェむスをわずかに装食しようずしたす。



奜奇心のために、WindowDialogから継承しおみおください。 このオプションを䜿甚するず、ラベルがXBMCむンタヌフェむスの䞊郚に衚瀺されたす。



Readyプラグむン「Hello world」は、こちらからダりンロヌドできたす 。 メニュヌ「システム」>「アドオン」>「ZIPファむルからむンストヌル」からプラグむンをむンストヌルできるこずを思い出させおください。 すべおの新しいプラグむンは、ナヌザヌ蚭定フォルダヌの\アドオンフォルダヌにむンストヌルされたす。 Windowsでは、これは通垞AppData\ XBMC、Linuxでは$ HOME / .xbmcです。



おわりに



独自のむンタヌフェヌスを備えたXBMCのプラグむンの䜜成に専念する蚘事のパヌトIでは、プラグむンむンタヌフェヌスの基本的な芁玠を怜蚎し、簡単な䟋を瀺したした。

次のパヌトでは、ダむアログに぀いお説明し、もう少し耇雑な䟋を挙げお、画像を䜿甚しおむンタヌフェむスを装食し、むンタラクティブな芁玠を䜜成する䟋を瀺したす。



少し先に走りたい人は、䞊蚘のコントロヌルを瀺すこのプラグむンをダりンロヌドできたす。 䞊蚘のコントロヌルの䟋ずずもにスクリヌンショットが撮られたのは圌からでした。 プラグむンは、私が曞いたマむクロフレヌムワヌクを䜿甚したす。これに぀いおはパヌトIIIで説明する予定ですが、経隓豊富な栄逊士は簡単に理解できるず思いたす。



PSいく぀かのマむナヌな修正ず远加を行いたした。

PPS onCloseメ゜ッドに関する情報を修正したした。



継続



独自のむンタヌフェヌスを備えたXBMC甚のプラグむンを䜜成しおいたすパヌトII-ダむアログず装食 。



All Articles