2

私のアプリにはシェルのようなコンソールがあり、すべてのコマンドの後に>>>>"でプロンプトが表示されます。問題は、シェルのWriteText( ">>>")を使用するたびに、新しい行が追加されることです。ユーザーは正しい行までバックスペースできますが、これはひどいように見えます。それを修正する方法はありますか?

4

1 に答える 1

6

あなたが自分TextCtrlのスタイルを宣言してからイベントwx.TE_PROCESS_ENTERをバインドしているのEVT_TEXT_ENTERではないかと思います。それを試したときに同じ問題が発生したからです。

私の最初の本能は、メソッドをwx.EVT_TEXT_ENTER使用して処理するメソッドを作成することでしたTextCtrl:Remove()。残念ながら、このメソッドは表示されている文字を削除するだけのようです。私の次の考えは、改行文字を消去するためにEmulateKeyPress()バックスペース()とともにメソッドを使用することでした。WKX_BACKこれは実行可能かもしれませんが、スプーフィングするための良い方法を思い付くことができなかったので(を送信するので、ではなく、を送信するためwx.KeyEventだけに使用することはできません)、そのアプローチをあきらめました...読者への演習として。event.m_keyCodeEVT_TEXT_ENTERCommandEventKeyEvent

wx.EVT_TEXT_ENTER最終的にCommandEvent機能した第3の角度に導かれました。バインドする代わりに、キー(ASCIIキーコード13)の特別な処理を使用して、wx.EVT_TEXT_ENTERバインドwx.EVT_CHARしてロジックを挿入しました。次に、前に説明したビット Returnを実装することを計画しましたが、TextCtrlスタイルから削除したときに、が密かに追加されていないことに気付きました。コードは次のとおりです。EmulateKeyPress()wx.TE_PROCESS_ENTER\n

import wx

class TestRun(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self, parent, title="StackO Test", size=(400,400))
        self.control = wx.TextCtrl(self, id=wx.ID_ANY, style=wx.TE_MULTILINE)
        self.control.Bind(wx.EVT_CHAR, self.OnPress)

        self.Show(True)

    def OnPress(self, event):
        if event.GetKeyCode() == 13:
            self.control.WriteText('\n>>>')
        else:
            event.Skip()

if __name__ == '__main__':
    app = wx.App(False)
    TestRun(None)
    app.MainLoop()

event.Skip()ラインは非常に重要です。これについての調査中に、KeyEvent通常はaの後に。が続くことを学びましたCharEvent。にCharEvent文字が書き込まれる部分ですTextCtrl。をインターセプトするKeyEventと、CharEvent明示的にインターセプトした場合にのみ呼び出されます。したがって、他の方法で通常どおりに動作さevent.skip()せたい場合は、が不可欠です。TextCtrlこれがないと、ASCIIキーコード13に等しくないキーボード入力は何もしません。

私のテストから、を呼び出すたびに改行を出力するTextCtrlスタイルを持つように宣言することについて何かがあるようです。私のやり方はこれを回避しますが、挿入ポイントが常に正しい場所にあることを確認することなどに関しては、さらに多くの作業が必要になります。wx.TE_PROCESS_ENTERWriteText()

頑張ってください!

于 2011-03-06T03:44:19.993 に答える