[pygtk] Re: A Timer and refreshing TextView

Steve McClure smcclure at racemi.com
Tue Dec 4 00:30:38 WST 2007


On Dec 3, 2007, at 9:18 AM, Mark Stahler wrote:

> John Finlay wrote:
>> Nathaniel Smith wrote:
>>> On Sun, Dec 02, 2007 at 09:34:40PM -0800, Aravind Vijayakumar wrote:
>>>
>>>> Since you are opening the file afresh each time in refreshLog,  
>>>> won't
>>>> you be reading the first line each time?
>>>
>>> The .read() method in Python reads the whole file, not just the  
>>> first
>>> line.
>>>
>>>
>> read() will also read from the current position so you can keep  
>> reading as new data is added. An alternative is to not open the  
>> file in refreshLog but when initializing and then read it in  
>> refreshLog which is called by timeout_add - something like:
>> Code:
>>       textview = self.gui.get_widget("bottom_textview")
>>       # Methods that need to be run on start
>>       file = open('log.txt')
>>       self.refreshLog()
>>       # Timer to autorefresh log
>>       timer = gobject.timeout_add(500, self.refreshLog)
>>       timer.start()
>>   def refreshLog(self):
>>      string = file.read()
>>      if string:
>>          buffer = textview.get_buffer()
>>          mark = buffer.create_mark("end", buffer.get_end_iter())
>>          textview.scroll_to_mark(mark, 0)
>>          buffer.insert_at_cursor(string)
>>          buffer.delete_mark_by_name("end")
>>      return True
>> John
>> _______________________________________________
>> pygtk mailing list   pygtk at daa.com.au
>> http://www.daa.com.au/mailman/listinfo/pygtk
>> Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/
>
> Thank you all for the replies. I was not aware of the problems with  
> the threading in GTK+.
>
> I got it working perfectly using the gobject timeout with Johns  
> modified routine. I now only have to insert new text from the log  
> and dont have to reread the whole thing.

You have it working now so this isn't really relevant. However, I had  
success using gnome.vfs.monitor_add.  It can call your event handler  
in several situations, I used MONITOR_EVENT_CHANGED to find out when  
my log files changed. I keep track of the current file position each  
time so I open, seek to that position, read, close, record the new  
position and add the data to the text buffer.  No polling necessary.  
And I assume that the gnome.vfs call is doing a select so it should  
be much more efficient.

>
> Thanks!
>
> _______________________________________________
> pygtk mailing list   pygtk at daa.com.au
> http://www.daa.com.au/mailman/listinfo/pygtk
> Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/
>



More information about the pygtk mailing list