GUIにSAMPハブを組み込む

概要

Pythonグラフィカルユーザインターフェース(GUI)ツールにSAMPハブを埋め込むためには、以下のコマンドを使用してハブをプログラミング的に起動する必要があります:

from astropy.samp import SAMPHubServer
hub = SAMPHubServer()
hub.start()

これはスレッド内でハブを起動し,非輻輳である.Web SAMPクライアントからの接続に興味がない場合には、以下のように使用することができます。

from astropy.samp import SAMPHubServer
hub = SAMPHubServer(web_profile=False)
hub.start()

これはあなたがしなければならないすべての仕事でなければならない。しかし,Webプロファイルをアクティブ状態に保つためには,Web SAMPクライアントが接続している場合には,ユーザにその接続を受け入れるかどうかを問い合わせる必要がある(セキュリティ上の理由から)追加的な考慮事項がある.デフォルトでは、端末内の確認メッセージはテキストベースのメッセージですが、GUIツールがあれば、GUIダイアログを開く必要がある場合があります。

そのためには、処理ダイアログのクラスを定義し、その後 実例. クラスまでの SAMPHubServer (クラス自体ではない)。このようなものは継承すべきです astropy.samp.WebProfileDialog 以下を追加する.

  1. GUIタイマはコールバックし,このコールバックは定期的に呼び出される. WebProfileDialog.handle_queue (以下の形式で提供 self.handle_queue )。

  2. A show_dialog 方法は、同意ダイアログを表示します。これには次のような論点がなければならない。

    • samp_name :要求を出したアプリケーションの名前.

    • details :要求を出したクライアントの詳細情報に関する辞書.この辞書でSAMP標準が要求する唯一のキーワードは samp.name これは、要求されたクライアントの名前を与える。

    • client :クライアントアドレスを含むホスト名,ポートペア.

    • origin :要求元の文字列を含む。

  3. ユーザー応答によると show_dialog 電話すべきだ WebProfileDialog.consent あるいは…。 WebProfileDialog.reject それがそうです。場合によっては、これは別のGUIコールの結果である可能性がある。

TkアプリケーションにSAMPハブを埋め込む例

以下のコードは、Web SAMP接続を監視し、対応するダイアログを開くTkアプリケーションの完全な例である。

import tkinter as tk
import tkinter.messagebox as tkMessageBox

from astropy.samp import SAMPHubServer
from astropy.samp.hub import WebProfileDialog

MESSAGE = """
A Web application which declares to be

Name: {name}
Origin: {origin}

is requesting to be registered with the SAMP Hub.  Pay attention
that if you permit its registration, such application will acquire
all current user privileges, like file read/write.

Do you give your consent?
"""

class TkWebProfileDialog(WebProfileDialog):
    def __init__(self, root):
        self.root = root
        self.wait_for_dialog()

    def wait_for_dialog(self):
        self.handle_queue()
        self.root.after(100, self.wait_for_dialog)

    def show_dialog(self, samp_name, details, client, origin):
        text = MESSAGE.format(name=samp_name, origin=origin)

        response = tkMessageBox.askyesno(
            'SAMP Hub', text,
            default=tkMessageBox.NO)

        if response:
            self.consent()
        else:
            self.reject()

# Start up Tk application
root = tk.Tk()
tk.Label(root, text="Example SAMP Tk application",
         font=("Helvetica", 36), justify=tk.CENTER).pack(pady=200)
root.geometry("500x500")
root.update()

# Start up SAMP hub
h = SAMPHubServer(web_profile_dialog=TkWebProfileDialog(root))
h.start()

try:
    # Main GUI loop
    root.mainloop()
except KeyboardInterrupt:
    pass

h.stop()

上記のスクリプトが実行されると、ウィンドウが開き、“例SAMP Tkアプリケーション”が表示されます。例えば、その後、以下のページに進む場合:

http://astrojs.github.io/sampjs/examples/pinger.html

Pingボタンをクリックすると、Tkアプリケーションで開いているダイアログが見えます。“確認”をクリックすると、以降の“Ping”コールはダイアログからポップアップされません。