私のアプリにはシェルのようなコンソールがあり、すべてのコマンドの後に>>>>"でプロンプトが表示されます。問題は、シェルのWriteText( ">>>")を使用するたびに、新しい行が追加されることです。ユーザーは正しい行までバックスペースできますが、これはひどいように見えます。それを修正する方法はありますか?
1 に答える
あなたが自分TextCtrl
のスタイルを宣言してからイベントwx.TE_PROCESS_ENTER
をバインドしているのEVT_TEXT_ENTER
ではないかと思います。それを試したときに同じ問題が発生したからです。
私の最初の本能は、メソッドをwx.EVT_TEXT_ENTER
使用して処理するメソッドを作成することでしたTextCtrl:Remove()
。残念ながら、このメソッドは表示されている文字を削除するだけのようです。私の次の考えは、改行文字を消去するためにEmulateKeyPress()
バックスペース()とともにメソッドを使用することでした。WKX_BACK
これは実行可能かもしれませんが、スプーフィングするための良い方法を思い付くことができなかったので(を送信するので、ではなく、を送信するためwx.KeyEvent
だけに使用することはできません)、そのアプローチをあきらめました...読者への演習として。event.m_keyCode
EVT_TEXT_ENTER
CommandEvent
KeyEvent
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_ENTER
WriteText()
頑張ってください!