VBデリゲートをPythonイベントハンドラーに変換するにはどうすればよいですか?

not2qubit

python.netを使用して、デリゲート(イベント)をサブスクライブしている次のVBコードをpythonに書き直す必要があります。

Imports MtApi

Public Class Form1
    Private apiClient As MtApiClient

    Public Sub New()
        InitializeComponent()
        apiClient = New MtApiClient
        AddHandler apiClient.QuoteUpdated, AddressOf QuoteUpdatedHandler
    End Sub

    Sub QuoteUpdatedHandler(sender As Object, symbol As String, bid As Double, ask As Double)
        Dim quoteSrt As String
        quoteSrt = symbol + ": Bid = " + bid.ToString() + "; Ask = " + ask.ToString()
        ListBoxQuotesUpdate.Invoke(Sub()
                                       ListBoxQuotesUpdate.Items.Add(quoteSrt)
                                   End Sub)
        Console.WriteLine(quoteSrt)
    End Sub

    ' These can be ignored for this discussion
    Private Sub btnConnect_Click(sender As System.Object, e As System.EventArgs) Handles btnConnect.Click
        apiClient.BeginConnect(8222)
    End Sub

    Private Sub btnDisconnect_Click(sender As System.Object, e As System.EventArgs) Handles btnDisconnect.Click
        apiClient.BeginDisconnect()
    End Sub
End Class

このVBコードは、mtapi.NETブリッジ用のVBアプリの一部です

Q:このVBデリゲートをPythonイベントハンドラーに変換する正しい方法は何ですか?


私はすでに次の多くのバリエーションを試しました:

...
import MtApi as mt
...
# apiClient_QuoteUpdated(object sender, string symbol, double bid, double ask)
def printTick(symbol, ask, bid):
    print('Tick: Symbol: {}  Ask: {:.5f}  Bid: {:.5f}'.format(symbol, ask, bid))


class OnTick:
    def __init__(self):
        self.listeners = []

    def __iadd__(self, listener):
        # Shortcut for using += to add a listener
        self.listeners.append(listener)
        return self

    def notify(self, *args, **kwargs):
        for listener in self.listeners:
            listener(*args, **kwargs)

mtc = mt.MtApiClient()
res = mtc.BeginConnect('127.0.0.1', 8222);

# This Works!
newTick = OnTick()
newTick += printTick
newTick.notify(SYM, 1.12400, 1.12300)

# This does NOT work!
newTick.notify(mtc.QuoteUpdate())
# TypeError: 'EventBinding' object is not callable

ここで答えを見てきました:

not2qubit

同様の質問でこの回答密接に関連しているように、問題はデリゲートコードを過度に複雑にすることでした。私たちは、単に必要はありませんOnTickのクラスをしてもすることを実現するQuoteUpdatedHandler()必要性4つの引数我々は交換するので、printTick(...)それと。

(もちろん、何かをもう少し複雑またはエレガントにしたい場合は、クラスでこれを作成する必要があります。)

次に、VBデリゲートの同等のPythonコードは次のようになります。

...
def QuoteUpdatedHandler(source, sym, bid, ask) :
    qstr = '{}: {:.5f} {:.5f}'.format(sym,bid,ask)
    print(qstr)

...
mtc = mt.MtApiClient()

print('Connecting...')
res = mtc.BeginConnect('127.0.0.1', 8222);

# VB: AddHandler mtc.QuoteUpdated, AddressOf QuoteUpdatedHandler
# Because we want the "AddressOf" of the function, we don't use the invoking "()"
mtc.QuoteUpdated += QuoteUpdatedHandler

print('ok')

# Now run in a loop and wait for the events:
while 1:
    pass
    try: 
        time.sleep(0.1)
    except KeyboardInterrupt:
        print('\n  Break!')
        break

if (mtc.IsConnected()) :
    mtc.PlaySound("tick")
    mtc.BeginDisconnect()
print('\n  Done!')

sys.exit(2)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

VB6で(イベントハンドラーではなく)ハンドルを作成するにはどうすればよいですか?

分類Dev

別のハンドラーからangularjsイベントハンドラーをトリガーするにはどうすればよいですか?

分類Dev

ドキュメントにC#イベントハンドラーデリゲートを含めるようにdocfxを構成するにはどうすればよいですか?

分類Dev

@ContentChildrentからイベントハンドラーを取得するにはどうすればよいですか?

分類Dev

@ContentChildrentからイベントハンドラーを取得するにはどうすればよいですか?

分類Dev

イベントハンドラーをモックするにはどうすればよいですか?

分類Dev

スペースキーをリッスンするキーイベントハンドラーを追加するにはどうすればよいですか?

分類Dev

sqlite(PDO)データベースデータをハイチャートコードにリンクするにはどうすればよいですか?

分類Dev

このコードをイベントハンドラーに書き換えるにはどうすればよいですか?

分類Dev

レンダーツリービルダーでnavlinkイベントハンドラーを追加するにはどうすればよいですか?

分類Dev

レンダーツリービルダーでnavlinkイベントハンドラーを追加するにはどうすればよいですか?

分類Dev

ランタイム値を含むデリゲートでイベントを初期化するにはどうすればよいですか?

分類Dev

ブートストラップdatepickerでイベントハンドラーのバインドを解除するにはどうすればよいですか?

分類Dev

datagridviewセルクリックイベントをDevExpressグリッドコントロールに変換するにはどうすればよいですか

分類Dev

放出されたイベントに非同期イベントハンドラーを使用するにはどうすればよいですか?

分類Dev

jqueryイベントハンドラーでmvcモデルを動的にフェッチするにはどうすればよいですか?

分類Dev

「変更」イベントハンドラーを動的に作成するにはどうすればよいですか?

分類Dev

このイベントハンドラーをjQueryプラグインにバインドするにはどうすればよいですか?

分類Dev

Xpathのjavascriptイベントハンドラーからリンクを取得するにはどうすればよいですか?

分類Dev

Blazorでカスタム値変更イベントハンドラーを作成するにはどうすればよいですか?

分類Dev

イベントハンドラーの外部で変数を使用するにはどうすればよいですか?

分類Dev

wxPythonイベントハンドラーでShiftキーが押されたかどうかを確認するにはどうすればよいですか?

分類Dev

ナビゲーターハンドルをプログラムでハイストックに設定するにはどうすればよいですか?

分類Dev

Javascriptイベントハンドラーを最初に実行するようにするにはどうすればよいですか?

分類Dev

コントロールのEventHandlerListにイベントハンドラーを適切に追加するにはどうすればよいですか?

分類Dev

DebugBreakハンドラーをインストールするにはどうすればよいですか?

分類Dev

既存のイベントハンドラーの名前を変更するにはどうすればよいですか?

分類Dev

Cocoaスクリプティング:AppleScriptハンドラー(イベント)を使用するにはどうすればよいですか?

分類Dev

Axonイベントハンドラー/インターセプターを追加して、ハンドラーに到達する前にイベントをインターセプトするにはどうすればよいですか?

Related 関連記事

  1. 1

    VB6で(イベントハンドラーではなく)ハンドルを作成するにはどうすればよいですか?

  2. 2

    別のハンドラーからangularjsイベントハンドラーをトリガーするにはどうすればよいですか?

  3. 3

    ドキュメントにC#イベントハンドラーデリゲートを含めるようにdocfxを構成するにはどうすればよいですか?

  4. 4

    @ContentChildrentからイベントハンドラーを取得するにはどうすればよいですか?

  5. 5

    @ContentChildrentからイベントハンドラーを取得するにはどうすればよいですか?

  6. 6

    イベントハンドラーをモックするにはどうすればよいですか?

  7. 7

    スペースキーをリッスンするキーイベントハンドラーを追加するにはどうすればよいですか?

  8. 8

    sqlite(PDO)データベースデータをハイチャートコードにリンクするにはどうすればよいですか?

  9. 9

    このコードをイベントハンドラーに書き換えるにはどうすればよいですか?

  10. 10

    レンダーツリービルダーでnavlinkイベントハンドラーを追加するにはどうすればよいですか?

  11. 11

    レンダーツリービルダーでnavlinkイベントハンドラーを追加するにはどうすればよいですか?

  12. 12

    ランタイム値を含むデリゲートでイベントを初期化するにはどうすればよいですか?

  13. 13

    ブートストラップdatepickerでイベントハンドラーのバインドを解除するにはどうすればよいですか?

  14. 14

    datagridviewセルクリックイベントをDevExpressグリッドコントロールに変換するにはどうすればよいですか

  15. 15

    放出されたイベントに非同期イベントハンドラーを使用するにはどうすればよいですか?

  16. 16

    jqueryイベントハンドラーでmvcモデルを動的にフェッチするにはどうすればよいですか?

  17. 17

    「変更」イベントハンドラーを動的に作成するにはどうすればよいですか?

  18. 18

    このイベントハンドラーをjQueryプラグインにバインドするにはどうすればよいですか?

  19. 19

    Xpathのjavascriptイベントハンドラーからリンクを取得するにはどうすればよいですか?

  20. 20

    Blazorでカスタム値変更イベントハンドラーを作成するにはどうすればよいですか?

  21. 21

    イベントハンドラーの外部で変数を使用するにはどうすればよいですか?

  22. 22

    wxPythonイベントハンドラーでShiftキーが押されたかどうかを確認するにはどうすればよいですか?

  23. 23

    ナビゲーターハンドルをプログラムでハイストックに設定するにはどうすればよいですか?

  24. 24

    Javascriptイベントハンドラーを最初に実行するようにするにはどうすればよいですか?

  25. 25

    コントロールのEventHandlerListにイベントハンドラーを適切に追加するにはどうすればよいですか?

  26. 26

    DebugBreakハンドラーをインストールするにはどうすればよいですか?

  27. 27

    既存のイベントハンドラーの名前を変更するにはどうすればよいですか?

  28. 28

    Cocoaスクリプティング:AppleScriptハンドラー(イベント)を使用するにはどうすればよいですか?

  29. 29

    Axonイベントハンドラー/インターセプターを追加して、ハンドラーに到達する前にイベントをインターセプトするにはどうすればよいですか?

ホットタグ

アーカイブ