2016-09-30 11 views
0

ケーススタディは説明するのが難しくはありませんが、wxPythonのTextCtrlはこのようにしばしば使用されることはないと思います。ここでは2つのTextCtrlを持つ簡単なウィンドウがあります。 1つは入力ウィジェット(ユーザーがそこにコマンドを入力するはずです)、2つ目は出力ウィジェットです(システムはコマンドの結果を表示します)。出力フィールドは読み取り専用のTextCtrlで、システムのみが書き込み可能です。wxPython:他のウィジェットのイベントをリダイレクトする(TextCtrl)

これまでのところとても良いです。さて、私は出力ウィジェットのイベントを傍受したいと思います:ユーザがこの出力フィールド(読み込み専用ウィジェット)を入力すると、入力フィールドにリダイレクトされ、入力を開始したテキストがそこに表示されます。最初の部分は複雑ではありません:私は出力ウィジェットのEVT_KEY_DOWNを傍受し、self.input.SetFocus()のようなことをすることができます。ただし、ユーザーが押したキーは失われます。彼/彼女が何かをタイプし始めたら、彼女はまたやり直さなければならない。これはショートカット機能(ユーザーが入力するフィールドに関係なく、入力ウィジェットに記述する必要があります)になります。

私はこれをなぜ行うのかについての短い注記です。これはまだまったくばかげている可能性があるためです。視認されたユーザーは、読み取り専用のウィジェットでうんざりすることはありません。彼らはそれを見て、彼らを一人のままにします。このアプリケーションは、スクリーンリーダーを持つユーザーのために設計されています。したがって、カーソルはしばしばそこにあり、キープレスは(読み取り専用のウィジェットなので)何の効果もありません。出力ウィジェットをタイプするときに、ユーザーが入力フィールドにリダイレクトされ、彼が既にこのウィジェットに入力していたテキストがあれば、素晴らしいことでしょう。

import wx 

class MyFrame(wx.Frame): 
    def __init__(self, parent): 
     wx.Frame.__init__(self, parent) 
     self.panel = MyPanel(self) 
     self.Show() 
     self.Maximize() 

class MyPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.SetSizer(sizer) 

     # Input field 
     self.input = wx.TextCtrl(self, -1, "", size=(125, -5), 
       style=wx.TE_PROCESS_ENTER) 

     # Ouput 
     self.output = wx.TextCtrl(self, -1, "", 
       size=(600, 400), style=wx.TE_MULTILINE|wx.TE_READONLY) 

     # Add the output fields in the sizer 
     sizer.Add(self.input) 
     sizer.Add(self.output, proportion=8) 

     # Event handler 
     self.output.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 

    def OnKeyDown(self, e): 
     """A key is pressed in the output widget.""" 
     modifiers = e.GetModifiers() 
     key = e.GetUnicodeKey() 
     if not key: 
      key = e.GetKeyCode() 

     print "From there, we should redirect to the input" 
     self.input.SetFocus() 

# Let's run that 
app = wx.App() 
MyFrame(None) 
app.MainLoop() 

答えて

1

self.input.EmulateKeyPress(e)を試してください。 Windowsの場合は正常に動作するはずです。他のプラットフォームでは完璧ではありませんが、基本的にはそれでも動作します。

その他のオプションは、wx.UiActionSimulatorを使用するか、コード内の入力textctrlに新しい文字を追加することです。

+0

ありがとう、それは私が必要としていたものです。矢印やその他のナビゲーションキーを解釈しないようにちょっと微調整しなければならなかったが、今はうまくいく。 –

関連する問題