Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python tkinter Entry widget status switch via Radio buttons

a simple question (not so simple for a tkinter newby like me): I'm building a GUI and I want to have two radio buttons driving the status (enabled or disabled) of an Entry widget, into which the user will input data. When the first radio button is pressed, I want the Entry to be disabled; when the second radio button is pressed, I want the Entry to be disabled.

Here is my code:

from Tkinter import *

root = Tk()
frame = Frame(root)

#callbacks
def enableEntry():
    entry.configure(state=ENABLED)
    entry.update()

def disableEntry():
    entry.configure(state=DISABLED)
    entry.update()

#GUI widgets
entry = Entry(frame, width=80)
entry.pack(side='right')

var = StringVar()
disableEntryRadioButton = Radiobutton(frame, text="Disable", variable=var, value="0", command=disableEntry)
disableEntryRadioButton.pack(anchor=W)
enableEntryRadioButton = Radiobutton(frame, text="Enable", variable=var, value="1", command=enableEntry)
enableEntryRadioButton.pack(anchor=W)

My idea is to invoke the proper callbacks when each radio button is pressed. But I'm not pretty sure that it actually happens with the code I wrote,because when I select the radios the status of the Entry is not switched.

Where am I wrong with it?

like image 321
csparpa Avatar asked Jun 07 '11 09:06

csparpa


1 Answers

You have a few things wrong with your program, but the general structure is OK.

  1. you aren't calling root.mainloop(). This is necessary for the event loop to service events such as button clicks, etc.
  2. you use ENABLED and DISABLED but don't define or import those anywhere. Personally I prefer to use the string values "normal" and "disabled".
  3. you aren't packing your main frame widget

When I fix those three things your code works fine. Here's the working code:

from Tkinter import *

root = Tk()
frame = Frame(root)
frame.pack()

#callbacks
def enableEntry():
    entry.configure(state="normal")
    entry.update()

def disableEntry():
    entry.configure(state="disabled")
    entry.update()

#GUI widgets
entry = Entry(frame, width=80)
entry.pack(side='right')

var = StringVar()
disableEntryRadioButton = Radiobutton(frame, text="Disable", variable=var, value="0", command=disableEntry)
disableEntryRadioButton.pack(anchor=W)
enableEntryRadioButton = Radiobutton(frame, text="Enable", variable=var, value="1", command=enableEntry)
enableEntryRadioButton.pack(anchor=W)

root.mainloop()
like image 56
Bryan Oakley Avatar answered Sep 19 '22 12:09

Bryan Oakley