ケーススタディは説明するのが難しくはありませんが、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()
ありがとう、それは私が必要としていたものです。矢印やその他のナビゲーションキーを解釈しないようにちょっと微調整しなければならなかったが、今はうまくいく。 –