•
•
•
•
What is DaniWeb IT Discussion Community?
You're currently browsing the Python section within the Software Development category of DaniWeb, a massive community of 329,047 software developers, web developers, Internet marketers, and tech gurus who are all enthusiastic about making contacts, networking, and learning from each other. In fact, there are 3,559 IT professionals currently interacting right now! Registration is free, only takes a minute and lets you enjoy all of the interactive features of the site.
Please support our Python advertiser:
Views: 1842 | Replies: 19
![]() |
•
•
Join Date: Nov 2006
Posts: 22
Reputation:
Rep Power: 2
Solved Threads: 0
Ok so I'm trying to use menu bars to grey out different widgets in my gui
il show you all the lines that i think are important and the error messages for each command i have tried.
thats assigning the main window as root, and creating a text entry box assigned to input_text with root as its master. The rest of the options there are not important.
These are the commands i tried to get the menu button to grey out the input_text widget.
The first command and error
input_menu.add_radiobutton(label='Input From File', variable = input_option, command = root.input_text(state = DISABLED))
File "C:\Python25\lib\lib-tk\Tkinter.py", line 1721, in __getattr__
return getattr(self.tk, attr)
AttributeError: input_text
The next command and error was
input_menu.add_radiobutton(label='Input From File', variable = input_option, command = input_text(state = DISABLED))
TypeError: 'NoneType' object is not callable
Any help with this would be great, I'm sorry if the code isn't all on the right lines.
il show you all the lines that i think are important and the error messages for each command i have tried.
root = Tk() input_text = Text(root, height = 10, width = 25).grid(row = 1, column = 1, sticky = N+S+E+W)
thats assigning the main window as root, and creating a text entry box assigned to input_text with root as its master. The rest of the options there are not important.
These are the commands i tried to get the menu button to grey out the input_text widget.
The first command and error
input_menu.add_radiobutton(label='Input From File', variable = input_option, command = root.input_text(state = DISABLED))
input_menu.add_radiobutton(label='Input From File', variable = input_option, command = root.input_text(state = DISABLED))
File "C:\Python25\lib\lib-tk\Tkinter.py", line 1721, in __getattr__
return getattr(self.tk, attr)
AttributeError: input_text
The next command and error was
input_menu.add_radiobutton(label='Input From File', variable = input_option, command = input_text(state = DISABLED))
input_menu.add_radiobutton(label='Input From File', variable = input_option, command = input_text(state = DISABLED))
TypeError: 'NoneType' object is not callable
Any help with this would be great, I'm sorry if the code isn't all on the right lines.
•
•
Join Date: Jul 2006
Posts: 498
Reputation:
Rep Power: 2
Solved Threads: 61
Oh... this is a confusing feature of GUI programming, and especially with Tkinter.
Making root the parent of input_text does *not* automatically make input_text the child of root.
Weird, huh?
Think of it like this: Tkinter is a Python interface to Tk. Thus, there are two systems going on at once -- Tk and Python. The line
tells Tk that you want a Text widget that is the child of root.
But Python doesn't know it! To inform Python, you have to do so explicitly:
Now, Python will make input_text a data member of root, which is what you wanted anyways.
Now, the second command just doesn't make sense.
input_text is a Text widget. The ( ) operator says "call this function." And command requires a function name -- NOT a called function, just the name.
So poor Python is nobly trying to call the Text widget and pass the return value as a function name to the command parameter of input_menu.add_radiobutton().
Not surprisingly, it complains. :lol:
What did you intend here?
Hope it helps,
Jeff
Making root the parent of input_text does *not* automatically make input_text the child of root.
Weird, huh?
Think of it like this: Tkinter is a Python interface to Tk. Thus, there are two systems going on at once -- Tk and Python. The line
Python Syntax (Toggle Plain Text)
input_text = Text(root, height = 10, width = 25).grid(row = 1, column = 1, sticky = N+S+E+W)
tells Tk that you want a Text widget that is the child of root.
But Python doesn't know it! To inform Python, you have to do so explicitly:
Python Syntax (Toggle Plain Text)
root.input_text = Text(root, ...) # rest of options go in ...
Now, Python will make input_text a data member of root, which is what you wanted anyways.
Now, the second command just doesn't make sense.
Python Syntax (Toggle Plain Text)
input_menu.add_radiobutton(label='Input From File', variable = input_option, command = [b]input_text(state = DISABLED)[/b])
input_text is a Text widget. The ( ) operator says "call this function." And command requires a function name -- NOT a called function, just the name.
So poor Python is nobly trying to call the Text widget and pass the return value as a function name to the command parameter of input_menu.add_radiobutton().
Not surprisingly, it complains. :lol:
What did you intend here?
Hope it helps,
Jeff
•
•
Join Date: Nov 2006
Posts: 22
Reputation:
Rep Power: 2
Solved Threads: 0
•
•
•
•
Python Syntax (Toggle Plain Text)
root.input_text = Text(root, ...) # rest of options go in ...
Now, Python will make input_text a data member of root, which is what you wanted anyways.
Would this not mean that your just changing the variable to root.input.text should it not be like this
Python Syntax (Toggle Plain Text)
input_text = root.Text(root, ...) # rest of options go in
•
•
•
•
Now, the second command just doesn't make sense.
Python Syntax (Toggle Plain Text)
input_menu.add_radiobutton(label='Input From File', variable = input_option, command = [b]input_text(state = DISABLED)[/b])
What did you intend here?
The command part was intended to mean that when the button was selected it would disable the input_text widget. Should i create a function that does this then put that as the command?
thanks for the help.
•
•
Join Date: Jul 2006
Posts: 498
Reputation:
Rep Power: 2
Solved Threads: 61
•
•
•
•
Originally Posted by jrcagle
Now, Python will make input_text a data member of root, which is what you wanted anyways.Python Syntax (Toggle Plain Text)
root.input_text = Text(root, ...) # rest of options go in ...
•
•
•
•
Would this not mean that your just changing the variable to root.input.text should it not be like this
Python Syntax (Toggle Plain Text)
input_text = root.Text(root, ...) # rest of options go in
Well, here's what the first one means:
* Create a Text widget.
* Assign the return value (the Text widget object itself) to the variable root.input_text.
So yes, it does change the value of root.input_text, by setting it equal to the Text widget. Previously, root.input_text did not exist, so that's not a problem; you haven't clobbered anything.
Here's what the second one means:
* call the function root.Text() (which doesn't exist, since Tk objects don't a function called Text())
* Assign the return value to the local variable input_text.
You don't want that, since input_text will go out of scope when your function ends, and then you lose ability to access it.
I hope that's clear...
•
•
•
•
Originally Posted by Hazel
The command part was intended to mean that when the button was selected it would disable the input_text widget. Should i create a function that does this then put that as the command?
Ah... yes, you should create a new function and supply the name of that function as the command.
Jeff
Last edited by jrcagle : Aug 18th, 2007 at 2:57 pm.
•
•
Join Date: Nov 2006
Posts: 22
Reputation:
Rep Power: 2
Solved Threads: 0
i these are the two variations of the function i use.
i then changed the command to look like this
this command with the first functions gives this error
root.input_menu.add_radiobutton(label='Input From File', variable = input_option, command = disable(root.input_text))
line 4, in disable
widget(state = disabled)
NameError: global name 'disabled' is not defined
the second function gives this error
root.input_menu.add_radiobutton(label='Input From File', variable = input_option, command = disable(root.input_text))
line 4, in disable
widget(state = DISABLED)
TypeError: 'NoneType' object is not callable
i also tried using a simple function with no variables but this gave the same errors as the last 2 depending on if i used caps to write disabled.
def disable(widget):
widget(state = disabled)
def disable(widget):
widget(state = DISABLED)i then changed the command to look like this
root.input_menu.add_radiobutton(label='Input From File', variable = input_option, command = disable(root.input_text))
this command with the first functions gives this error
root.input_menu.add_radiobutton(label='Input From File', variable = input_option, command = disable(root.input_text))
line 4, in disable
widget(state = disabled)
NameError: global name 'disabled' is not defined
the second function gives this error
root.input_menu.add_radiobutton(label='Input From File', variable = input_option, command = disable(root.input_text))
line 4, in disable
widget(state = DISABLED)
TypeError: 'NoneType' object is not callable
i also tried using a simple function with no variables but this gave the same errors as the last 2 depending on if i used caps to write disabled.
Last edited by Haze : Aug 19th, 2007 at 7:35 am.
•
•
Join Date: Jul 2006
Posts: 498
Reputation:
Rep Power: 2
Solved Threads: 61
Right, you want to pass the NAME of the function:
What you're doing is calling the function *when* you add the radiobutton, then setting command = return value.
Remember that the () operator means "call the function now."
Jeff
Python Syntax (Toggle Plain Text)
def disable(): root.input_text["state"] = DISABLED root.input_menu.add_radiobutton(label='Input From File', variable = input_option, command = disable)
What you're doing is calling the function *when* you add the radiobutton, then setting command = return value.
Remember that the () operator means "call the function now."
Jeff
•
•
Join Date: Nov 2006
Posts: 22
Reputation:
Rep Power: 2
Solved Threads: 0
•
•
•
•
Python Syntax (Toggle Plain Text)
def disable(): root.input_text["state"] = DISABLED root.input_menu.add_radiobutton(label='Input From File', variable = input_option, command = disable)
Ok so i have made a function and changed the command
def disable():
root.input_text(state = DISABLED) #way you wrote it doesn't work
root.input_menu.add_radiobutton(label='Input From File', variable = input_option, command = disable)the program loads correctly but as soon as i press that button in the GUI i get this error
File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
return self.func(*args)
root.input_text(state = DISABLED)
TypeError: 'NoneType' object is not callable
also even if this way does work it seems like the wrong way to do it because i would have to create a new function for every widget i wish to disable, surely there is a way to pass variables into functions using the command.
Posted by jrcagle:
Posted by Haze:
Do you see the difference...?
posted by jrcagle:
you understand this or ...?
Ok,
Posted by jrcagle:
or
kath.
•
•
•
•
def disable():
root.input_text["state"] = DISABLED
Posted by Haze:
•
•
•
•
def disable():
root.input_text(state = DISABLED) #way you wrote it doesn't work
Do you see the difference...?
posted by jrcagle:
•
•
•
•
Remember that the () operator means "call the function now."
Ok,
root.input_text is an object NOT function. So in your case you want to set property of this object. So you either call member function or set its object's property in the way,Posted by jrcagle:
•
•
•
•
def disable():
root.input_text["state"] = DISABLED
or
root.input_text.config(state = 'DISABLED')
kath.
Last edited by katharnakh : Aug 19th, 2007 at 11:03 pm.
challenge the limits
•
•
Join Date: Jul 2006
Posts: 498
Reputation:
Rep Power: 2
Solved Threads: 61
Here's a working small version:
Hope it helps,
Jeff
Python Syntax (Toggle Plain Text)
from Tkinter import * def disable(): root.button["state"] = DISABLED root = Tk() root.button = Radiobutton(root, text="My Button") root.button2 = Button(root, text="Disable the Radiobutton", command=disable) root.button.grid() root.button2.grid() root.mainloop()
Hope it helps,
Jeff
•
•
Join Date: Nov 2006
Posts: 22
Reputation:
Rep Power: 2
Solved Threads: 0
from Tkinter import *
def disable():# temp
root.input_text['state'] = DISABLED
root = Tk()
root.input_text = Text(root, height = 10, width = 25).grid(row = 1, column = 1, sticky = N+S+E+W)
root.mainbar_menu = Menu(root)
root.input_menu = Menu(root.mainbar_menu)
root.mainbar_menu.add_cascade(label='Input Options', menu = root.input_menu)
root.input_menu.add_radiobutton(label='Input From File', command = disable)
root.config(menu=root.mainbar_menu)
root.mainloop()This code is taken out of part of the larger program im writing so some of the code may seem pointless, im only keeping it their in case i dont realise how much of a effect it has.
error -
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
return self.func(*args)
File "C:/Documents and Settings/Owner/Desktop/ex.py", line 4, in disable
root.input_text['state'] = DISABLED
TypeError: 'NoneType' object does not support item assignment
The error occurs when i click the menu button, not when the program loads. What am i doing wrong when im making this menu?
also your example worked fine, although i tried editing it so i would not have to write a new function for every time i want to disable a diffrent widget by changing these lines.
def disable(widget):
widget["state"] = DISABLED
root.button2 = Button(root, text="Disable the Radiobutton", command=disable(root.button))this doesnt work as expected because as soon as the gui has loaded the button is allready disabled. sorry i took over a week to get back to you but getting this program to work is not exactly high proiority right now. thanks.
![]() |
•
•
•
•
Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
•
•
•
•
DaniWeb Marketplace (Sponsored Links)
- Windows GUI - problem with dialog box (C++)
- Python GUI (Python)
- Python GUI build: Logic Complications and Mistakes (Python)
- A subtle python cgi problem (Python)
- Problem with find (Python)
- starting Python (Python)
- Java GUI problem... contents of JFrame is invisible... (Java)
- My Irritating Error - Help (Python)
- basic java GUI problem (Java)
Other Threads in the Python Forum
- Previous Thread: Moola Gold Rush Solver
- Next Thread: How do I declare a class member function in another class?


Linear Mode