I have a bunch of Menubuttons in my application, lets call them A, B and C.
Each Menubutton is bound to <ButtonPress-1> so, before the menu choices are
displayed, I can enable/disable some of those choices depending on the situation at
the time, and each binding leads to its own Menubutton-specific handler.
If the user clicks on Menubutton-A then the corresponding handler runs as
expected. If, without making a choice from menu A, the user then clicks on
Menubutton-B then - and this is the nub of the problem - the handler bound to
Menubutton-B does NOT run. If the user now clicks on Menubutton-C, then the
handler for B, yes B, runs.
Is this a bug, a feature or me being stupid? I'm running Python 2.6.5 on Ubuntu
10.04. The simplest demonstration example I could manage follows. Clicking on
Menubutton A shows, in the label to the right of the Menubuttons, that the
handler ran. If you then click immediately (without selecting any of the dummy
menu choices or otherwise making the open menu go away) on Menubutton B then
the handler does not run. If you then click on Menubutton A (or for that, click
again in Menubutton B) then the handler for B runs.
I've already developed a workaround for my particular application, but this
strikes me as anomalous behavior.
Cheers
Cam Farnell
import Tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.pack()
self.MenuButtonA = tk.Menubutton(self,text='Menu Button A')
self.MenuButtonA.pack(side='left')
T = tk.Menu(self.MenuButtonA)
T.add_command(label='Dummy 1')
T.add_command(label='Dummy 2')
self.MenuButtonA['menu'] = T
self.MenuButtonA.bind('<ButtonPress-1>',self.HandlerA)
self.MenuButtonB = tk.Menubutton(self,text='Menu Button B')
self.MenuButtonB.pack(side='left')
T = tk.Menu(self.MenuButtonB)
T.add_command(label='Dummy 1')
T.add_command(label='Dummy 2')
self.MenuButtonB['menu'] = T
self.MenuButtonB.bind('<ButtonPress-1>',self.HandlerB)
self.InfoLabel = tk.Label(self,text='---------')
self.InfoLabel.pack(side='left')
def HandlerA(self,Event):
self.InfoLabel['text'] = 'Handler A'
def HandlerB(self,Event):
self.InfoLabel['text'] = 'Handler B'
app = Application()
app.master.title("Sample application")
app.mainloop()
_______________________________________________
Tkinter-discuss mailing list
Tkinter-discuss@python.org
http://mail.python.org/mailman/listinfo/tkinter-discuss