2008-09-30 27 views
1

我有一個小的日誌應用程序(用wxPython編寫),它從我們正在開發的一些工具包中接收數據,並且我想要顯示滾動窗口中的文本。現在,我正在使用wx.TextCtrl進行文本顯示,但我遇到了滾動行爲的一些問題。我如何從wxPython中的wx.TextCtrl控件獲取滾動位置/範圍

基本上,我喜歡它,所以如果滾動條位於窗口的底部(即傳入數據的末尾),添加更多的數據應該向前滾動視圖。但是,如果視圖向上滾動了一點(即用戶正在查看像錯誤消息這樣有趣的內容),則應用程序應該只在最後添加文本而不滾動。

我有此刻的兩個問題:

  1. 我無法工作,如何檢索當前滾動位置(以GetScrollPos()的調用似乎不工作 - 他們只返回0 )。
  2. 我不知道如何檢索滾動條的當前範圍(調用GetScrollRange()只返回1)。

我google了一下,似乎有一些暗示,建議GetScrollPos和GetScrollRange不會工作的wx.TextCtrl?有沒有人有過這方面的經驗?有沒有一個簡單的方法來解決這個問題,或者我將不得不推出我自己的wx.TextCtrl?

回答

1

我只是測試一個簡單的例子(檢查GetScrollPos(0)GetScrollRange(0)EVT_TEXT事件處理程序wx.TextCtrl),它爲我工作得很好 - 他們分別返回當前顯示的行,行總數的指標。

也許問題是你的wxPython版本?我用:

>>> import wx 
>>> wx.version() 
'2.8.9.1 (msw-unicode)' 
+0

好點 - 看起來像我不經意地調用窗口框架而不是嵌套的CTextCtrl。 我仍然停留在滾動範圍底部時停止滾動的東西... – 2008-09-30 22:46:09

4

好了,所以這裏的地方我得:

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」選項,它都會變成梨形。我真的需要這樣做語法高亮的錯誤,但如果我不能啓用該選項,我註定要單色 - 噓!

有關如何阻止對富編輯控件進行滾動的更多想法?

相關問題