天天看點

wxPython控件學習之TextCtrl(三)響應文本控件事件

<code>frame.Bind(wx.EVT_TEXT, frame.OnText, text)</code>

<code></code>

TextCtrl支援的事件類型:

-----------------------------------------------------------------

EVT_TEXT:文本因使用者的輸入或在程式中使用SetValue()而被改變,都要産生該事件。

EVT_TEXT_ENTER:當使用者在一個wx.TE_PROCESS_ENTER樣式的文本控件中

                按下了Enter鍵時,産生該事件。

EVT_TEXT_URL:如果在Windows系統上,wx.TE_RICH或wx.TE_RICH2樣式被設定了,

              并且wx.TE_AUTO_URL樣式也被設定了,那麼當在文本控件内的URL上

              發生了一個滑鼠事件時,該事件被觸發。

EVT_TEXT_MAXLEN:如果使用SetMaxLength()指定了該控件的最大長度,那麼當

                 使用者試圖輸入更長的字元串時,該事件被觸發。

                 例如,這時給使用者顯示一個警告消息。

#注意:

當使用多行wx.TextCtrl的時候,要知道的一點是,該文本控件是以何種方

式存儲字元串的。在内部,存儲在該wx.TextCtrl中的多行字元是以\n作為行的

分隔符的。這與基本的作業系統無關,即使某些系統使用了不同的字元組合作

為一行的分隔符。當你使用GetValue()來擷取該字元串時,原來的行分隔符被還

原,是以你不必考慮手工轉換。這個的好處就是控件中的文本不依賴于任何特

定的作業系統。

缺點是,文本控件中的行的長度和行的索引與它們在文本控件外的可能是

不同的。例如,如果你在一個Windows系統上,系統所用的行分隔符是\r\n,

通過GetValue()所得知的字元串的長度将比通過GetLastPosition()所得知的字元串

的結尾長。通過在例7.3中增加下面兩行:

print ”getValue”, len(multiText.GetValue())

print ”lastPos”, multiText.GetLastPosition()

我們在Unix系統上所得的結果應該是:

getValue 119

lastPos 119

我們在Windows系統上所得的結果應該是:

getValue 121

這意味你不應該使用多行文本控件的位置索引來取得原字元串,位置索引

應該用作wx.TextCtrl的另外方法的參數。對于該控件中的文本的子串,應該使

用GetRange()或GetSelectedText()。也不要反向索引;不要使用原字元串的索引

來取得并放入文本控件中。下面是一個例子,它使用了不正确的方法在插入點

之後直接得到10個字元:

<code>aLongString = ”””Any old multi line string will do here. Just as long as it is multiline””” text = wx.TextCtrl(panel, -1, aLongString, style=wx.TE_MULTILINE) x = text.GetInsertionPoint() selection = aLongString[x : x + 10] #這将是不正确的</code>

在Windows或Mac系統中要得到正确的結果,最後一行應換為:

<code>selection = text.GetRange(x, x + 10)</code>

繼續閱讀