A Dangling Tk Entry

W. eWatson notvalid2 at sbcglobal.net
Tue Mar 10 13:41:07 CET 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