wxPythonのwx.TextCtrlコントロールからスクロール位置/範囲を取得するにはどうすればよいですか
-
03-07-2019 - |
質問
開発中の少しのキットからデータを受け取る小さなロギングアプリ(wxPythonで作成)があり、スクロールウィンドウにテキストを表示したい。現状では、テキスト表示にwx.TextCtrlを使用していますが、スクロール動作に問題があります。
基本的に、スクロールバーがウィンドウの下部(つまり、受信データの最後)にある場合、データを追加するとビューが前方にスクロールするようになります。ただし、ビューが少し上にスクロールしている場合(つまり、ユーザーがエラーメッセージのような興味深いものを見ている場合)、アプリはスクロールせずに最後にテキストを追加するだけです。
現時点では2つの問題があります:
- 現在のスクロール位置を取得する方法がわかりません(GetScrollPos()の呼び出しは機能しないようです-単に0を返します)。
- スクロールバーの現在の範囲を取得する方法がわかりません(GetScrollRange()の呼び出しは1を返すだけです)。
少しグーグルで調べたところ、wx.TextCtrlに対してGetScrollPosとGetScrollRangeが機能しないことを示唆するヒントがいくつかあるようです。この分野で他に経験のある人はいますか?問題を解決するための素晴らしい簡単な方法はありますか、それとも独自のwx.TextCtrlをロールバックする必要がありますか?
解決
単純な例をテストしました( wxの
)そしてそれは私のためにうまく動作します-それらは現在表示されている行のインデックスと行の総数をそれぞれ返します。 EVT_TEXT
イベントハンドラーで GetScrollPos(0)
および GetScrollRange(0)
をチェックします) .TextCtrl
たぶん問題はあなたのwxPythonバージョンですか?私が使用した:
>>> import wx
>>> wx.version()
'2.8.9.1 (msw-unicode)'
他のヒント
さて、ここで私ができることは次のとおりです:
import wx
from threading import Timer
import time
class Form1(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.logger = wx.TextCtrl(self,5, "",wx.Point(20,20), wx.Size(200,200), \
wx.TE_MULTILINE | wx.TE_READONLY)# | wx.TE_RICH2)
t = Timer(0.1, self.AddText)
t.start()
def AddText(self):
# Resart the timer
t = Timer(0.25, self.AddText)
t.start()
# Work out if we're at the end of the file
currentCaretPosition = self.logger.GetInsertionPoint()
currentLengthOfText = self.logger.GetLastPosition()
if currentCaretPosition != currentLengthOfText:
self.holdingBack = True
else:
self.holdingBack = False
timeStamp = str(time.time())
# If we're not at the end of the file, we're holding back
if self.holdingBack:
print "%s FROZEN"%(timeStamp)
self.logger.Freeze()
(currentSelectionStart, currentSelectionEnd) = self.logger.GetSelection()
self.logger.AppendText(timeStamp+"\n")
self.logger.SetInsertionPoint(currentCaretPosition)
self.logger.SetSelection(currentSelectionStart, currentSelectionEnd)
self.logger.Thaw()
else:
print "%s THAWED"%(timeStamp)
self.logger.AppendText(timeStamp+"\n")
app = wx.PySimpleApp()
frame = wx.Frame(None, size=(550,425))
Form1(frame)
frame.Show(1)
app.MainLoop()
このシンプルなデモアプリはほぼ完璧に機能します。ユーザーがテキストの最後にない行をクリックしない限り、きれいにスクロールします。それ以降は、テキストが選択できるようにそのままの状態に保たれます(注:下にではなく上に選択すると選択がクリアされるというバグがあります)。
最大の悩みは、" |を有効にしようとするとwx.TE_RICH2"オプション、それはすべて少し梨形になります。エラーの構文強調表示を行うためにこれが本当に必要ですが、そのオプションを有効にできない場合、私はモノクロに運命づけられています-ブー!
リッチエディットコントロールでのスクロールを抑制する方法についてのアイデアはありますか?