On 26/11/14 23:23, boB Stepp wrote:

def printLabel():
     print "Button number ", var.get(), " was pressed."
     print "You selected this option:", l[var.get() - 1][0]

...
buttonNumber = []
l = [("Brain_Partial", 1), ("Brain_Whole", 2),
                         ("Head & Neck", 3), ("Chest", 4), ("Breast_Whole", 5),
                         ("Breast_Partial", 6), ("Abdomen", 7), ("Pelvis", 8),
                         ("Prostate", 9)]
var = IntVar()
for text, value in l:
     buttonNumber.append(Radiobutton(root, text = text, value = value,
                     command=printLabel, variable = var).pack(anchor=W))

First question: How can the printLabel() function see the list
variable, l, defined outside of this function? I thought that
functions only had access to variables local to the function and
whatever else is passed to it during the function call.

...and read access to global variables; of which l is one.
You can also get write access by declaring the variable as global inside the function. That will work here because you made l global.

Better is to use a parameter of printLabel() and then pass 'l'
in when you call it when the button is pressed. That way the data can be anywhere or you can even use more than one data source for the same function. How do you do that? Declare another function:

def printLabel(data):
    # use data here

def callPrintLabel():
    return printLabel(l)

Then pass the new function name into your command.

buttonNumber.append(Radiobutton(root, text = text,
                    value = value, command=callPrintLabel,
                    variable = var).pack(anchor=W))


But since callPrintLabel()'s a one liner we can bypass the
definition and use a lambda with a default parameter instead:

buttonNumber.append(Radiobutton(root, text = text,
                    value = value, command=lambda d=l: printLabel(d),
                    variable = var).pack(anchor=W))

Now when the button is clicked it will call the lambda which uses
l as the default value for its parameter d. And it then calls
printLabel(d).

Second: Will the statements near the end that return the display
screen's width and height be a reliable way of determining the user's
actual monitor settings? My intent is to use this information to
appropriately scale and position windows; not only in this particular
simple window, but in others to come which will potentially be large
and complex. I have tested this on two different sized monitors where
I work and so far it has given the correct results.

It should do.

Third: I am always open to stylistic comments and how to be more pythonic!

Any sizeable GUI tends to be easier using OOP techniques. Most Tkinter GUI tutorials show how to write OOP based Tkinter code. Otherwise you wind up with an awful lot of global variables to remember and control.

Fourth: And perhaps this should go into a new thread, I am not sure I
understand the full intent and use of Tkinter's Variable class. Any
clarification on this would be welcome as well.

It's just a convenience feature provided by Tk and carried through to Tkinter. I rarely use it myself, finding it nearly as easy to do the management myself. But it does save a few lines...

--
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/
http://www.amazon.com/author/alan_gauld
Follow my photo-blog on Flickr at:
http://www.flickr.com/photos/alangauldphotos


_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to