On Tue, 10 Mar 2009 12:41:07 -0000, W. eWatson <notval...@sbcglobal.net> wrote:

[snippety snip]

Rhodri James wrote:
> 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)

I'm operating from the command line too.  The traceback is:

"""
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1406, in __call__
    return self.func(*args)
  File "temp.py", line 34, in Set_Enter_Data
    dialog = Enter_Data_Dialog( self.master, sdict )
  File "temp.py", line 60, in __init__
    tkSimpleDialog.Dialog.__init__(self, parent)
  File "/usr/lib/python2.5/lib-tk/tkSimpleDialog.py", line 64, in __init__
    self.initial_focus = self.body(body)
  File "temp.py", line 68, in body
    entry.insert(0,11)
AttributeError: 'NoneType' object has no attribute 'insert'
"""

In other words "entry" is None. This is the "entry" that's a local variable in the Enter_Data_Dialog class "body" method (called automatically by tkSimpleDialog.Dialog.__init__, it turns out, so my apologies for implying that it wasn't called at all), the one that's created by the line

entry = Entry(master,...).grid(row=0,...)

Given that this is what "grid" is expected to return, this shouldn't be the shock that apparently it is. This "entry" is also the return value from "body", which won't be helpful. The Dialog documentation says this:

"""body(self, master)
create dialog body.

return widget that should have initial focus.
This method should be overridden, and is called
by the __init__ method."""

This suggests that the code originally looked like this:

entry = Entry(master,...)
entry.grid(row=0,...)

and someone decided to "optimise" it. Put it back the way it used to be, and your problem will magically vanish.

--
Rhodri James *-* Wildebeeste Herder to the Masses
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to