Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7165123
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 28, 20262026-05-28T14:11:20+00:00 2026-05-28T14:11:20+00:00

I wrote a simple Tkinter based Python application that reads text from a serial

  • 0

I wrote a simple Tkinter based Python application that reads text from a serial connection and adds it to the window, specifically a text widged.

After a lot of tweaks and some very strange exceptions, this works. Then I added autoscrolling by doing this:

self.text.insert(END, str(parsed_line))
self.text.yview(END)

These lines run in a thread. The thread blocks on reading fromt the serial connection, splits lines and then adds all lines to the widget.

This works, too. Then I wanted to allow the user to scroll which should disable auto-scroll until the user scrolls back to the bottom.

I found this
Stop Text widget from scrolling when content is changed
which seems to be related. Especially, I tried the code from DuckAssasin’s comment:

if self.myWidgetScrollbar.get() == 1.0:
    self.myWidget.yview(END)

I also tried .get()[1] which is actually the element I want (bottom position). However, this crashes with the following exception:

Traceback (most recent call last):
  File "transformer-gui.py", line 119, in run
    pos = self.scrollbar.get()[1]
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 2809, in get
    return self._getdoubles(self.tk.call(self._w, 'get'))
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 1028, in _getdoubles
    return tuple(map(getdouble, self.tk.splitlist(string)))
ValueError: invalid literal for float(): None

It seems as if tkinter somewhere returns None which then is being parsed as a float. I read somewhere, that e.g. the index method of the text widged sometimes returnes None if the requested location is not visible.

Hopefully, anybody can help me out with this problem!

[EDIT]

Ok, I have assembled a demo script that can reproduce this issue on my Win XP machine:

import re,sys,time
from Tkinter import *
import Tkinter
import threading
import traceback


class ReaderThread(threading.Thread): 
    def __init__(self, text, scrollbar):
        print "Thread init"
        threading.Thread.__init__(self) 
        self.text = text
        self.scrollbar = scrollbar
        self.running = True

    def stop(self):
        print "Stopping thread"
        running = False

    def run(self):
        print "Thread started"
        time.sleep(5)
        i = 1
        try:
            while(self.running):
                # emulating delay when reading from serial interface
                time.sleep(0.05)
                line = "the quick brown fox jumps over the lazy dog\n"

                curIndex = "1.0"
                lowerEdge = 1.0
                pos = 1.0

                # get cur position
                pos = self.scrollbar.get()[1]

                # Disable scrollbar
                self.text.configure(yscrollcommand=None, state=NORMAL)

                # Add to text window
                self.text.insert(END, str(line))
                startIndex = repr(i) + ".0"
                curIndex = repr(i) + ".end"

                # Perform colorization
                if i % 6 == 0:
                    self.text.tag_add("warn", startIndex, curIndex)
                elif i % 6 == 1:
                    self.text.tag_add("debug", startIndex, curIndex)                            
                elif i % 6 == 2:
                    self.text.tag_add("info", startIndex, curIndex)                         
                elif i % 6 == 3:
                    self.text.tag_add("error", startIndex, curIndex)                            
                elif i % 6 == 4:
                    self.text.tag_add("fatal", startIndex, curIndex)                            
                i = i + 1

                # Enable scrollbar
                self.text.configure(yscrollcommand=self.scrollbar.set, state=DISABLED)

                # Auto scroll down to the end if scroll bar was at the bottom before
                # Otherwise allow customer scrolling                        

                if pos == 1.0:
                    self.text.yview(END)

                #if(lowerEdge == 1.0):
                #   print "is lower edge!"
                #self.text.see(curIndex)
                #else:
                #   print "Customer scrolling", lowerEdge

                # Get current scrollbar position before inserting
                #(upperEdge, lowerEdge) = self.scrollbar.get()
                #print upperEdge, lowerEdge

                #self.text.update_idletasks()
        except Exception as e:
            traceback.print_exc(file=sys.stdout)
            print "Exception in receiver thread, stopping..."
            pass
        print "Thread stopped"


class Transformer:
    def __init__(self):
        pass

    def start(self):
        """starts to read linewise from self.in_stream and parses the read lines"""
        count = 1
        root = Tk()
        root.title("Tkinter Auto-Scrolling Test")
        topPane = PanedWindow(root, orient=HORIZONTAL)
        topPane.pack(side=TOP, fill=X)
        lowerPane = PanedWindow(root, orient=VERTICAL)

        scrollbar = Scrollbar(root)
        scrollbar.pack(side=RIGHT, fill=Y)
        text = Text(wrap=WORD, yscrollcommand=scrollbar.set)
        scrollbar.config(command=text.yview)
        # Color definition for log levels
        text.tag_config("debug",foreground="gray50")
        text.tag_config("info",foreground="green")
        text.tag_config("warn",foreground="orange")
        text.tag_config("error",foreground="red")
        text.tag_config("fatal",foreground="#8B008B")
        # set default color
        text.config(background="black", foreground="gray");
        text.pack(expand=YES, fill=BOTH)        

        lowerPane.add(text)
        lowerPane.pack(expand=YES, fill=BOTH)

        t = ReaderThread(text, scrollbar)
        print "Starting thread"
        t.start()

        try:
            root.mainloop()
        except Exception as e:
            print "Exception in window manager: ", e

        t.stop()
        t.join()


if __name__ == "__main__":
    try:
        trans = Transformer()
        trans.start()
    except Exception as e:
        print "Error: ", e
        sys.exit(1)     

I let this scipt run and start to scroll up and down and after some time I get a lot of always different exceptions such as:

.\source\testtools\device-log-transformer>python tkinter-autoscroll.py
Thread init
Starting thread
Thread started
Traceback (most recent call last):
  File "tkinter-autoscroll.py", line 59, in run
    self.text.configure(yscrollcommand=self.scrollbar.set, state=DISABLED)
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 1202, in configure
Stopping thread
    return self._configure('configure', cnf, kw)
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 1193, in _configure
    self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
TclError: invalid command name ".14762592"
Exception in receiver thread, stopping...
Thread stopped

.\source\testtools\device-log-transformer>python tkinter-autoscroll.py
Thread init
Starting thread
Thread started
Stopping thread
Traceback (most recent call last):
  File "tkinter-autoscroll.py", line 35, in run
    pos = self.scrollbar.get()[1]
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 2809, in get
    return self._getdoubles(self.tk.call(self._w, 'get'))
TclError: invalid command name ".14762512"
Exception in receiver thread, stopping...
Thread stopped

.\source\testtools\device-log-transformer>python tkinter-autoscroll.py
Thread init
Starting thread
Thread started
Traceback (most recent call last):
  File "tkinter-autoscroll.py", line 65, in run
    self.text.yview(END)
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 3156, in yview
    self.tk.call((self._w, 'yview') + what)
Stopping threadTclError: invalid command name ".14762592"

 Exception in receiver thread, stopping...
Thread stopped

.\source\testtools\device-log-transformer>python tkinter-autoscroll.py
Thread init
Starting thread
Thread started
Traceback (most recent call last):
  File "tkinter-autoscroll.py", line 35, in run
    pos = self.scrollbar.get()[1]
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 2809, in get
    return self._getdoubles(self.tk.call(self._w, 'get'))
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 1028, in _getdoubles
    return tuple(map(getdouble, self.tk.splitlist(string)))
ValueError: invalid literal for float(): None
Exception in receiver thread, stopping...
Thread stopped
Stopping thread

.\source\testtools\device-log-transformer>python tkinter-autoscroll.py
Thread init
Starting thread
Thread started
Traceback (most recent call last):
  File "tkinter-autoscroll.py", line 53, in run
    self.text.tag_add("error", startIndex, curIndex)
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 3057, in tag_add
    (self._w, 'tag', 'add', tagName, index1) + args)
TclError: bad option "261.0": must be bbox, cget, compare, configure, count, debug, delete, dlineinfo, dump, edit, get, image, index, insert, mark, pe
er, replace, scan, search, see, tag, window, xview, or yview
Exception in receiver thread, stopping...
Thread stopped

I hope this helps you to help me 🙂

Thanks,

/J

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-28T14:11:21+00:00Added an answer on May 28, 2026 at 2:11 pm

    OK,

    based on the valuable suggestions by noob oddy I was able to rewrite the example script by using the Tkinter.generate_event() method to generate asynchronous event and a queue to pass the information.

    Every time a line is read from the stream (which is simulated by a constant string and a delay), I append the line to a queue (because passing objects to the event method is not supported AFAIK) and then create a new event.

    The event callback method retrieves the message from the queue and adds it to the Text widged. This works because this method is called from the Tkinter mainloop an thus it cannot interfere with the other jobs.

    Here is the script:

    import re,sys,time
    from Tkinter import *
    import Tkinter
    import threading
    import traceback
    import Queue
    
    
    class ReaderThread(threading.Thread): 
        def __init__(self, root, queue):
            print "Thread init"
            threading.Thread.__init__(self) 
            self.root = root
            self.running = True
            self.q = queue
    
        def stop(self):
            print "Stopping thread"
            running = False
    
        def run(self):
            print "Thread started"
            time.sleep(5)
    
            try:
                while(self.running):
                    # emulating delay when reading from serial interface
                    time.sleep(0.05)
                    curline = "the quick brown fox jumps over the lazy dog\n"
    
                    try:
                        self.q.put(curline)
                        self.root.event_generate('<<AppendLine>>', when='tail')
                    # If it failed, the window has been destoyed: over
                    except TclError as e:
                        print e
                        break
    
            except Exception as e:
                traceback.print_exc(file=sys.stdout)
                print "Exception in receiver thread, stopping..."
                pass
            print "Thread stopped"
    
    
    class Transformer:
        def __init__(self):
            self.q = Queue.Queue()
            self.lineIndex = 1
            pass
    
        def appendLine(self, event):
            line = self.q.get_nowait()
    
            if line == None:
                return
    
            i = self.lineIndex
            curIndex = "1.0"
            lowerEdge = 1.0
            pos = 1.0
    
            # get cur position
            pos = self.scrollbar.get()[1]
    
            # Disable scrollbar
            self.text.configure(yscrollcommand=None, state=NORMAL)
    
            # Add to text window
            self.text.insert(END, str(line))
            startIndex = repr(i) + ".0"
            curIndex = repr(i) + ".end"
    
            # Perform colorization
            if i % 6 == 0:
                self.text.tag_add("warn", startIndex, curIndex)
            elif i % 6 == 1:
                self.text.tag_add("debug", startIndex, curIndex)                            
            elif i % 6 == 2:
                self.text.tag_add("info", startIndex, curIndex)                         
            elif i % 6 == 3:
                self.text.tag_add("error", startIndex, curIndex)                            
            elif i % 6 == 4:
                self.text.tag_add("fatal", startIndex, curIndex)                            
            i = i + 1
    
            # Enable scrollbar
            self.text.configure(yscrollcommand=self.scrollbar.set, state=DISABLED)
    
            # Auto scroll down to the end if scroll bar was at the bottom before
            # Otherwise allow customer scrolling                        
    
            if pos == 1.0:
                self.text.yview(END)
    
            self.lineIndex = i
    
        def start(self):
            """starts to read linewise from self.in_stream and parses the read lines"""
            count = 1
            self.root = Tk()
            self.root.title("Tkinter Auto-Scrolling Test")#
            self.root.bind('<<AppendLine>>', self.appendLine)
            self.topPane = PanedWindow(self.root, orient=HORIZONTAL)
            self.topPane.pack(side=TOP, fill=X)
            self.lowerPane = PanedWindow(self.root, orient=VERTICAL)
    
            self.scrollbar = Scrollbar(self.root)
            self.scrollbar.pack(side=RIGHT, fill=Y)
            self.text = Text(wrap=WORD, yscrollcommand=self.scrollbar.set)
            self.scrollbar.config(command=self.text.yview)
            # Color definition for log levels
            self.text.tag_config("debug",foreground="gray50")
            self.text.tag_config("info",foreground="green")
            self.text.tag_config("warn",foreground="orange")
            self.text.tag_config("error",foreground="red")
            self.text.tag_config("fatal",foreground="#8B008B")
            # set default color
            self.text.config(background="black", foreground="gray");
            self.text.pack(expand=YES, fill=BOTH)       
    
            self.lowerPane.add(self.text)
            self.lowerPane.pack(expand=YES, fill=BOTH)
    
            t = ReaderThread(self.root, self.q)
            print "Starting thread"
            t.start()
    
            try:
                self.root.mainloop()
            except Exception as e:
                print "Exception in window manager: ", e
    
            t.stop()
            t.join()
    
    
    if __name__ == "__main__":
        try:
            trans = Transformer()
            trans.start()
        except Exception as e:
            print "Error: ", e
            sys.exit(1)     
    

    Thanks again to everybody who contributed for your help!

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I wrote a simple Sinatra app that generate an image using rmagick from some
I wrote simple application that using the cell phone camera. When i trying to
I wrote a simple application for facebook and it seems that i fail to
I wrote a simple tool to generate a DBUnit XML dataset using queries that
I wrote a simple CMS for one of my clients which does specifically what
I'm trying to write a simple Arkanoid with the help of Python and Tkinter.
I wrote a simple file upload application using ASP.NET MVC. I tested it successfully
I wrote simple NMEA parser and I'm reading latitude and longitude from GPS. Values
I wrote simple update/insert statements that are returning a syntax error, what am I
I wrote this simple test code, by adapting a piece from a book, to

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.