0

私はwxWidgetsライブラリを使用していくつかのWindowsアプリをコーディングしていますが、何か面白いことにこだわっています。

    def HandleDblclick (self, event):
        self.ItemActivation (event.GetItem ())

    def HandleKeydown (self, event):
        keyc = event.GetKeyCode ()
        if keyc == 13:
            self.ItemActivation (event.GetItem ())
        elif keyc == 32:
            self.ItemSelection (event.GetItem ())
        self.sbar.SetStatusText (str (keyc) + " was pressed.")

    def HandleRclick (self, event):
        self.ItemSelection (event.GetItem ())

(はい、Pythonです)。ItemActivation()とItemSelection()はすべての汚い仕事をします。ただし、マウスボタンを押したときのみです。キーを入力すると、次の出力が得られます。

File "C:\Python27\lib\site-packages\wx-2.8-msw-unicode\wx\_controls.py", line 5315, in GetItemPyData
return _controls_.TreeCtrl_GetItemPyData(*args, **kwargs)
wx._core.PyAssertionError: C++ assertion "param" failed at ..\..\src\msw\treectrl.cpp(1083) in wxTreeCtrl::SetItemData(): failed to change tree items data

TreeCtrlをコーディングしようとしています。面白いことに、それでもツリーは拡張されます(キーを入力)が、アイテムの選択(スペース)はまったく機能しません。

何が起こっているのか、そしてその理由は?wxWidgetsはイベントを2回処理しようとしていると思います。1回はデフォルトのハンドラーで、2回は私のものです。しかし、私が正しければ、wx.TreeCtrlのデフォルトのキーボードイベント処理を無効にする方法は?

前もって感謝します。

4

2 に答える 2

1

まず第一に、ネイティブ コントロールで自分でキーボードを処理しようとするのは悪い考えです。EVT_KEY_DOWNハンドラーを完全に削除して、EVT_TREE_ITEM_ACTIVATED代わりに処理してください。これは、ネイティブ コントロールからイベントを盗むのとは異なり、すべてのプラットフォームで動作することが保証されています。

第二に、SetItemData()失敗に関するエラーは、この関数をまったく呼び出していないため、表示されたコードとは何の関係もないようです。したがって、関連するすべての部分を見せてはいけません。

于 2012-09-18T09:29:35.980 に答える
0

そのため、エラーは興味深いものです。データ項目は設定しません。私は実際にそれを受け取ろうとします。悪臭を放つ行は、私の両方のダーティワーク機能の最初の行です。

ikey = self.GetPyData (item)

何が起こっているのか、なぜwxWidgetsエンジンがアイテムにデータを割り当てようとするのかは本当にわかりません。グーグルおじさんにこのエラーを聞いたのですが、使える情報がありませんでした。

キーボードの取り扱いについてご意見ありがとうございます。

于 2012-09-18T09:59:11.653 に答える