[Tutor] Event handler for optionmenu

Jorge Louis de Castro jobauk at hotmail.com
Mon Aug 15 14:06:56 CEST 2005


Hi,

Thanks for your reply. It wasn't lazyness, believe me, I did look around for 
solutions and found something similar to yours here:

http://www.astro.washington.edu/owen/TkinterSummary.html#TracingVariables

The problem is that I have a class and it wants the callback function to be 
a global name (I also can't figure out hot to pass parameters to it)

By being a global name I can't access the var with widget.getvar(), and it 
complains if I use root by saying:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python24\Lib\lib-tk\Tkinter.py", line 1345, in __call__
    return self.func(*args)
  File "C:\Workplace\python\piim\Tkclient.py", line 312, in doLangChoices
    varValue = root.getvar(name)
AttributeError: Tkclient instance has no attribute 'getvar'


The code on the class follows:

class StartWin:

	def initialize(self):
		self.startw=Tk(className="Login")
		self.startw.servlab=Label(self.startw, text="Server:")
		self.startw.servin=Entry(self.startw, width=15)
		self.startw.servlab.grid(column=0, row=0)
		self.startw.servin.grid(column=1, row=0)
		self.startw.portlab=Label(self.startw, text="Port:")
		self.startw.portin=Entry(self.startw, width=15)
		self.startw.portlab.grid(column=0, row=1)
		self.startw.portin.grid(column=1, row=1)
		self.startw.nicklab=Label(self.startw, text="Nickname:")
		self.startw.nickin=Entry(self.startw, width=15)
		self.startw.nicklab.grid(column=0, row=2)
		self.startw.nickin.grid(column=1, row=2)
		self.startw.l1=Label(self.startw, text="Language:")
		self.startw.l1.grid(column=0, row=3)
                                OPTIONS = ["en","pt","es","it","fr","de"]
                                self.startw.variable = StringVar()
                                self.startw.variable.set(OPTIONS[0]) # 
default value
                                self.startw.variable.trace('w', 
doLangChoices) # trace choices
                	self.startw.whis_butt=apply(OptionMenu, (self.startw, 
self.startw.variable) + tuple(OPTIONS))
		self.startw.whis_butt.grid(column=1, row=3)

		self.startw.login_butt=Button(self.startw, text="Login", 
command=self.login)
		self.startw.login_butt.grid(column=0, row=4)
		self.startw.exit_butt=Button(self.startw, text="Exit", command=self.exit)
		self.startw.exit_butt.grid(column=1, row=4)
		self.startw.mainloop()

	#connect client with inserted data
	def login(self):
		start_client(self.startw.servin.get(), int(self.startw.portin.get()), 
self.startw.nickin.get(), self.startw.variable.get())

	def exit(self):
		self.startw.quit()
		self.startw.destroy()
		#sys.exit()


def doLangChoices(name, index, mode):
        print "callback called with name=%r, index=%r, mode=%r" % (name, 
index, mode)
        # HOW TO ACCESS THE VAR VALUE HERE??
        #varValue = root.getvar(name)
        #print varValue

print "Client Started"
try:
    conn=StartWin()
    conn.initialize()
    root=Tkclient()
    thread.start_new_thread(listen_server, (client, root))
    root.startWindow()
except Exception:
    print "Client thread aborted"



>From: geon <geon at post.cz>
>To: Jorge Louis De Castro <jorge at bcs.org.uk>
>CC: tutor at python.org
>Subject: Re: [Tutor] Event handler for optionmenu
>Date: Mon, 15 Aug 2005 11:41:30 +0200
>
>Jorge Louis De Castro napsal(a):
>
>>Hi,
>>  I have an optionmenu widget that works just fine except that  can't find 
>>docs to get hold of events as they happen, kinda like the command=XYZ of 
>>other widgets like buttons.
>>  The code I'm using for the option menu is the following:
>>  OPTIONS = ["en","pt","es","it","fr","de"]
>>self.startw.variable = StringVar()
>>self.startw.variable.set(OPTIONS[0]) # default value
>>self.startw.whis_butt=apply(OptionMenu, (self.startw, 
>>self.startw.variable) + tuple(OPTIONS))
>>self.startw.whis_butt.grid(column=1, row=3)
>>  Now I'd like to have a function like:
>>  def onChange(self):
>>      # do optionmenu specific stuff
>>  but can't find how to do it, how to associate/bind onChange with the 
>>optionmenu widget.
>>Any help will be highly appreciated.
>>
>
>This art is called Trace Variable and could be used like this (copied and 
>rearranged from one of the prevously posted message from here):
>
>from Tkinter import *
>
>OPTIONS = [
>    "egg",
>    "bunny",
>    "chicken"
>]
>
>def callbackFunc(name, index, mode):
>  #print "callback called with name=%r, index=%r, mode=%r" % (name, index, 
>mode)
>  varValue = root.getvar(name)
>  print varValue
>  # modify the value, just to show it can be done
>  #root.setvar(name, varValue)
>
>root = Tk()
>var = StringVar()
>var.set(OPTIONS[2]) # default value
>rememberMe = var.trace_variable('w', callbackFunc)  # var.trace('w', 
>callbackFunc) # this works, too
>
>
>
>w = OptionMenu (root, var, *OPTIONS)
>w.pack()
>
>
>root.mainloop()
>
>Hope its what you asked for :-)
>
>--
>geon




More information about the Tutor mailing list