1

TextCtrl / Styled TextCtrl内のキャレットの位置が変更された場合、どのようなイベントが呼び出されますか?ステータスバーにキャレットの現在の位置を表示するには、イベントをバインドする必要があります。

4

4 に答える 4

2

wx.EVT_KEY_UP次のように、イベントをwx.TextCtrlオブジェクト にバインドしてみてください。

import wx

class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Show Caret Position", size=(400, 140))
        panel = wx.Panel(self, wx.ID_ANY)
        sizer = wx.BoxSizer(wx.VERTICAL)
        text = wx.StaticText(panel, -1, "Text:", (10, 22))
        self.textCtrl = wx.TextCtrl(
                panel,
                -1, "",
                (50,5),
                size=(250, 50),
                style=wx.TE_MULTILINE
            )
        self.textCtrl.SetInsertionPoint(0)
        self.textCtrl.Bind(wx.EVT_KEY_UP,self.onTextKeyEvent)
        self.textCtrl.Bind(wx.EVT_LEFT_UP,self.onTextKeyEvent)
        self.statusbar = self.CreateStatusBar(1)
        panel.SetSizerAndFit(sizer, wx.VERTICAL)

    def onTextKeyEvent(self, event):
        statusText = "Caret Position: "+str(self.textCtrl.GetInsertionPoint())
        self.SetStatusText(statusText,0)
        event.Skip()


#Run application
if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyForm()
    frame.Show()
    app.MainLoop()

+を使用してWindows 7環境でテストしました。Python 2.7wxPython 2.8

これがどのように見えるべきかです

于 2012-04-30T19:29:19.170 に答える
1

@Tariq M Nasimコードの問題は、現在のキャレット位置ではなく、実際に最後の位置を提供することです。私が見つけた最も簡単な方法は、イベントチェーンがすでに存在している間に新しいイベントを投稿して、新しいイベントがキューの最後のイベントとして処理されるようにすることです。

# create event class as global
import wx.lib.newevent
SomeNewEvent, EVT_SOME_NEW_EVENT = wx.lib.newevent.NewEvent()

# then bind the events in the constructor or somewhere
self.text_ctrl.Bind(wx.EVT_CHAR, self.onKeyDownHandler)
self.text_ctrl.Bind(wx.EVT_LEFT_DOWN, self.onKeyDownHandler)
self.text_ctrl.Bind(wx.EVT_RIGHT_UP, self.onKeyDownHandler)
# bind also new event handler but 
self.text_ctrl.Bind(EVT_SOME_NEW_EVENT , self.onKeyDownAction)

# then define the handlers
def onKeyDownAction(self, evt):
    print("Insertion point {}".format(self.text_ctrl.GetInsertionPoint()))
    evt.Skip()

def onKeyDownHandler(self, evt):
    evt.Skip()
    # post the new event so it will be handled later
    wx.PostEvent(self.text_ctrl, SomeNewEvent())

このようにして、onKeyDownActionで取得する挿入ポイントは適切です。

于 2019-11-30T12:18:36.043 に答える
0

そのようなイベントはないと思いますが、wx.EVT_SET_CURSORを試すことができます。または、wx.EVT_CHARまたはEVT_KEY_ *イベントの1つをキャッチし、TextCtrlのGetInsertionPoint()メソッドを使用して、カーソルがどこにあるかを知ることができます。マウスイベントを使用してテキストコントロールをクリックするときにも、メソッドを呼び出す必要がある場合があります。

于 2012-04-30T14:50:04.853 に答える
0

マウスがウィンドウ内にいつ配置されているかを知るために、wx.EVT_ENTER_WINDOWをバインドできます(ここを参照) 。

于 2017-03-29T11:36:01.267 に答える