Tkinter check box behaviour - Windows / Linux discrepancy

peter peter.mosley at talk21.com
Fri Nov 10 00:28:41 CET 2006


I've come across a weird difference between the behaviour of the
Tkinter checkbox in Windows and Linux.  The issue became apparent in
some code I wrote to display an image in a fixed size canvas widget. If
a checkbox was set then the image should be shrunk as necessary to fit
the canvas while if cleared it should appear full size with scrollbars
if necessary.

The code worked fine under Linux (where it was developed).  But under
Windows, the first click in the checkbox did nothing, then subsequent
clicks adjusted the size according to the PREVIOUS, not the current,
checkbox state.

I've isolated the problem in the code below, which shows a single
checkbox and a label to describe its state. It works ok under Linux,
but in Windows it is always one click behind.

Any ideas?  I am using
   Linux: Fedora Core 3, Python 2.3.4
   Windows: Windows NT, Python 2.3.4

Peter

========================================================================
import Tkinter as tk



class App:

    def __init__(self,frmMain):

        """
        Demonstrate difference in Windows / Linux handling of check box

        Text in lblTest should track check box state
        """

        # Set up form

        self.intTest=tk.IntVar()

        self.chkTest=tk.Checkbutton(frmMain,text='Click
me!',variable=self.intTest)

        self.chkTest.grid(row=0,column=0,padx=5,pady=5,sticky=tk.W)

        self.chkTest.bind('<ButtonRelease-1>',self.chkTest_click)



        self.lblTest=tk.Label(frmMain,text='Dummy')

        self.lblTest.grid(row=1,column=0,padx=5,pady=5,sticky=tk.W)


        self.chkTest_click() # so as to initialise text

    def chkTest_click(self,event=None):
        # read check box state and display appropriate text
        if self.intTest.get()==0:
            self.lblTest.config(text='Check box cleared')
        else:
            self.lblTest.config(text='Check box set')




if __name__=='__main__':

    frmMain=tk.Tk()

    app=App(frmMain)

    frmMain.mainloop()




More information about the Python-list mailing list