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

Reply via email to