ケース スタディを説明するのはそれほど難しいことではないように思えますが、wxPython の TextCtrl がこのように使用されることはあまりないと思います。2 つの TextCtrls を持つ単純なウィンドウがあります。1 つは入力ウィジェット (ユーザーはそこにコマンドを入力することになっています) で、2 つ目は出力ウィジェット (システムがコマンドの結果を表示します) です。出力フィールドは読み取り専用の 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()