2011-03-05 85 views
2

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

+0

これはwxpythonのTextCtrl.WriteText()操作です – Shaunak

+0

(何かどこかに改行を追加しています...それがどこにあるかを調べる:p) –

+0

試しました。はい、本当にひどい。それのための解決策がありません – joaquin

答えて

6

TextCtrlのスタイルはwx.TE_PROCESS_ENTERとし、EVT_TEXT_ENTERというイベントのみをバインドしていると思われます。これは、同じ問題が発生したためです。

私の最初の本能は、wx.EVT_TEXT_ENTERを処理する方法を書いて、TextCtrl:Remove()メソッドを使用することでした。このメソッドは、残念なことに可視文字を削除するように見えます。私の次の考えは、バックスペース(WKX_BACK)と一緒にEmulateKeyPress()メソッドを使用して改行文字を消去することでした。私はwx.KeyEventを偽装するための良い方法を考え出すことができませんでしたが、これはなんとかなるかもしれません(EVT_TEXT_ENTERKeyEventCommandEventを送信し、ないので、ちょうどevent.m_keyCodeを使用することはできません)ので、私は誤る...そのアプローチをあきらめた、Iこの解決策が読者に運動として残されていることを意味します。

wx.EVT_TEXT_ENTERは、CommandEventであり、最終的には機能した第3の角度に導かれた。 wx.EVT_TEXT_ENTERをバインドする代わりに、wx.EVT_CHARをバインドし、Returnキー(ASCIIキーコード13)の特別な処理でロジックに入れました。以前私が話したEmulateKeyPress()ビットを実装する予定でしたが、wx.TE_PROCESS_ENTERをTextCtrlスタイルから削除したとき、私は\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には通常CharEventが続きます。 CharEventは、文字がTextCtrlに書き込まれる部分です。 KeyEventを傍受すると、CharEventが明示的に呼び出された場合にのみ呼び出されます。が正常に動作するようにするには、event.skip()が非常に重要です。それがなければ、ASCIIキーコード13と等しくないキーボード入力は何もしません。

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

最高の運が!

+0

ちょっと変わった後にこれを理解しましたが、すばらしい答えです。 – Shaunak

+0

私の特定のセットアップ/ケースはまったく同じではないかもしれませんが、 'wx.TextCtrl.write(text)'が 'wx.TextCtrl.write(text.rstrip())'を実行するだけで改行を追加するのを防ぎました。私自身の 'text'変数に改行を入力しなかったので驚いていましたが、どうやら' .write() 'で何らかの形で追加し、テキスト変数に' .rstrip() 'を使用すると、 (@チャックスマッシュのための明確で広範な答えに対して+1)。 – Montmons

関連する問題