Getting value from Tkinter entry widget: variable scope difficulty

K

Kevin Walzer

I'm trying to construct a simple Tkinter GUI and I'm having trouble with
getting the value of an entry widget and passing it onto a callback
function. But I'm not grokking variable scope correctly.

I have two functions. Here are the relevant excerpts:

def makeGUI():

###lots of code to set up toplevel windows

searchbutton=Button(topframe, image=searchglass, command=doSomething)
searchbutton.image=searchglass
searchbutton.pack(side=LEFT, expand = NO)

searchterm=StringVar()

entryterm=Entry(topframe, textvariable=searchterm)
entryterm.pack(side=RIGHT)

entrylabel=Label(topframe, text="Search:")
entrylabel.pack(side=RIGHT)


def doSomething():

file = os.popen('systemcommand %s' % searchterm, 'r')

print searchterm

---

What I want to happen is the value of searchterm to be passed on to the
doSomething() call when the searchbutton is pressed. Right now it
appears the value of "searchterm" is local to each function.

In Tcl this would be handled by simply assigning the variable
"searchterm" to the global namespace in each function, i.e. "global
searchterm." I've looked and can't quite figure out how to do this in
Python. Any advice is appreciated.
 
J

jim-on-linux

Kevin,
if the present value of searchterm is what you
want, I suggest you make a class


class Kgui:
def __init__(self) : # init self
self.makeGUI()


def makeGUI(self):

###lots of code to set up toplevel windows

searchbutton=Button(topframe,
image=searchglass, command=self.doSomething)
searchbutton.image=searchglass
searchbutton.pack(side=LEFT, expand = NO)

# and all the resrt of the code


def doSomething(self):

file = os.popen('systemcommand %s' %
searchterm, 'r')

self.searchterm = searchterm

print self.searchterm #used inside the class

Kgui.searchterm = searchterm

print Kgui.searchterm #used outside the class




you can also do;
Kgui.searchterm = self.searchterm = searchterm

I think this is what you are asking for.

jim-on-linux

http://www.inqvista.com
 
H

Hendrik van Rooyen

Kevin Walzer said:
I'm trying to construct a simple Tkinter GUI and I'm having trouble with
getting the value of an entry widget and passing it onto a callback
function. But I'm not grokking variable scope correctly.

I have two functions. Here are the relevant excerpts:

def makeGUI():

###lots of code to set up toplevel windows

searchbutton=Button(topframe, image=searchglass, command=doSomething)
searchbutton.image=searchglass
searchbutton.pack(side=LEFT, expand = NO)

searchterm=StringVar()

this will make a new local variable - if you want to assign to the global one,
you need to add a global statement before doing this, in this makeGUI function.
- you can read the global here if you have defined searchterm in an outer scope,
but the assign will make a new local one.
entryterm=Entry(topframe, textvariable=searchterm)
entryterm.pack(side=RIGHT)

entrylabel=Label(topframe, text="Search:")
entrylabel.pack(side=RIGHT)


def doSomething():

file = os.popen('systemcommand %s' % searchterm, 'r')

here searchterm seems to be a command line variable.
look in the help for sys.argv how to access command line variables

- not that you need to, but its good to know... :)

had makeGUI been a class instead of a function, you could have
written makeGUI.searchterm here, without mucking around with globals....
print searchterm

---

What I want to happen is the value of searchterm to be passed on to the
doSomething() call when the searchbutton is pressed. Right now it
appears the value of "searchterm" is local to each function.

True

In Tcl this would be handled by simply assigning the variable
"searchterm" to the global namespace in each function, i.e. "global
searchterm." I've looked and can't quite figure out how to do this in
Python. Any advice is appreciated.

global searchterm # - in outer scope

global searchterm # - in inner scope before assign


HTH - Hendrik
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,039
Latest member
CasimiraVa

Latest Threads

Top