A Dangling Tk Entry
W. eWatson
notvalid2 at sbcglobal.net
Tue Mar 10 08:41:07 EDT 2009
Rhodri James wrote:
> On Tue, 10 Mar 2009 04:14:51 -0000, W. eWatson <notvalid2 at sbcglobal.net>
> wrote:
>
>> Marc 'BlackJack' Rintsch wrote:
>>> On Mon, 09 Mar 2009 04:22:57 -0700, W. eWatson wrote:
>>>
>>>> Marc 'BlackJack' Rintsch wrote:
>>>>> On Sun, 08 Mar 2009 22:20:09 -0700, W. eWatson wrote:
>>>>>
>>>>>> You didn't answer my question why entry is necessary at all. The
>>>>>> original author thought it was necessary to return entry. I'll give
>>>>>> you a peek at a segment of the code I'm working with here:
>>>>>>
>>>>>> class Enter_Data_Dialog(tkSimpleDialog.Dialog):
>>>>>>
>>>>>> def __init__(self, parent, sdict):
>>>>>> self.sdict = sdict
>>>>>> tkSimpleDialog.Dialog.__init__(self, parent)
>>>>>>
>>>>>> def body(self,master):
>>>>>> self.title("Set a Number Entry Dialog")
>>>>>>
>>>>>> Label( master, text="Number ").grid(row=0, sticky=W)
>>>>>> self.anumberVar = StringVar()
>>>>>> entry = Entry(master, width=10,
>>>>>> textvariable=self.anumberVar).grid(row=0,
>>>>> column=1)
>>>>>> self.anumberVar.set( "%d" % self.sdict["anumber"] )
>>>>>>
>>>>>> return entry
>>>>> `entry` is unnecessary here. But that was not obvious from your
>>>>> previous example, as you trimmed the code. Now it is clear that
>>>>> `entry` is always `None` because that's what `grid()` returns.
>>>>>
>>>>> But according to the docs this method should return the widget, that
>>>>> should get the focus, so maybe the author really wanted to return the
>>>>> `Entry` instance here, instead of `None`.
>>>> He's got to return something, because he uses it upon return, as here:
>>> `entry` is always `None`, so it is the same as returning nothing
>>> because every function has an implicit ``return None`` at the end.
>>>
>>>> def Set_Enter_Data(self):
>>>> sdict = {}
>>>> sdict[ "ok" ] = False
>>>> sdict[ "anumber" ] = self.anumber
>>>> dialog = Enter_Data_Dialog( self.master, sdict ) <---
>>>> returning
>>> That's not a call to the `body()` method so that ``return`` is
>>> irrelevant here. Here an instance of `Enter_Data_Dialog` is
>>> created. No ``return`` involved.
>>> BTW if this is really just a dialog to enter a number, the functions
>>> `askinteger()` or `askfloat()` from the `tkSimpleDialog` module can
>>> be used.
>>> Ciao,
>>> Marc 'BlackJack' Rintsch
>> What you are seeing here as an example, is a paired down version of
>> the 2000 line program to focus on the particular problem at hand. The
>> full code uses up to 20 variable of various types, via the dialog
>> object. It uses them successfully to get the values the user has
>> entered. How can it be irrelevant if it works? The author thought this
>> was the way to do it. It's not my invention. It's no fluke. He does
>> the same thing in another dialog that brings back about 6 values.
>>
>> def body(self,master):
> [snip]
>
> You're misunderstanding. The line that you arrowed above has absolutely
> nothing whatsoever to do with the method "body()", so keeping on showing
> us ever fuller version of that isn't going to prove anything. Now if
> you were to show us a line like "something = dialog.body(something_else)"
> then you might be onto something, but personally I suspect you're going
> to find that rather hard.
>
I'd be happy to comply. Perhaps I'm mistaken as what I was responding to in
the entanglement of responses, but I think I was making a point (again) that
the technique by the author works. This should clear matters up completely.
Here's the full 80+ lines of the example code. Note wrapped lines.
================================
from Tkinter import *
import tkSimpleDialog
import tkMessageBox
class IntVar_GUI:
def __init__(self, master):
master.title('Control Variable Fun')
self.frame = Frame(master,takefocus=1,
highlightthickness=2, highlightcolor='blue')
self.frame.configure(height=200,width=200)
self.frame.pack()
#self.frame.bind("<KeyPress>", self.HandleKey)
self.anumber = 123 # Want name and value to be configurable
self.master = master
menu = Menu(master)
master.config(menu=menu)
self.mainMenu = Menu(menu)
menu.add_cascade(label="My Menu",menu=self.mainMenu)
self.mainMenu.add_command(label="Enter Data",
command=self.Set_Enter_Data)
self.mainMenu.add_command(label="Exit",underline=1,command=self.Quit)
self.Focus()
def Set_Enter_Data(self):
sdict = {}
sdict[ "ok" ] = False
sdict[ "anumber" ] = self.anumber
dialog = Enter_Data_Dialog( self.master, sdict )
self.Focus()
print "Howdy, set data. Number is:", dialog.anumberVar.get()
print "dict:", dialog.sdict
if not dialog.sdict["ok"]:
return
try:
self.anumber = int(eval(dialog.anumberVar.get()))
print "OK"
except:
print "Not OK"
pass
print "self.anumber:", self.anumber
def Quit(self):
self.running = False
#self.master.quit()
self.master.destroy()
def Focus( self ):
self.frame.focus_set()
class Enter_Data_Dialog(tkSimpleDialog.Dialog):
def __init__(self, parent, sdict):
self.sdict = sdict
tkSimpleDialog.Dialog.__init__(self, parent)
def body(self,master):
self.title("Set a Number Entry Dialog")
Label( master, text="Number ").grid(row=0, sticky=W)
self.anumberVar = StringVar()
entry = Entry(master, width=10,
textvariable=self.anumberVar).grid(row=0, column=1)
entry.insert(0,11)
self.anumberVar.set( "%d" % self.sdict["anumber"] )
return entry
def apply(self):
self.sdict["ok"] = True
def Process():
root = Tk()
app = IntVar_GUI(root)
root.mainloop()
if __name__ == "__main__":
Process()
====================================
Because I'm operating out for a command prompt, I don't seem to be able to
copy all the error msgs, but here is the last one shown involving line 68,
AttributeError: "None Type' object has no attribute 'insert'
Line 68 is entry.insert(0,11)
--
W. eWatson
(121.015 Deg. W, 39.262 Deg. N) GMT-8 hr std. time)
Obz Site: 39° 15' 7" N, 121° 2' 32" W, 2700 feet
Web Page: <www.speckledwithstars.net/>
More information about the Python-list
mailing list