简体   繁体   中英

Python 3 Tkinter Menu widget's callback seems out of sequence

I'm having trouble with the Tkinter Menu widget (no menu button), whereby the callback seems to run out of sequence. Here is a very minimal example:

# Python 3.6.5.  Windows 7 x64.
from tkinter import *
root = Tk()

popup = Menu(root, tearoff=0)
popup.add_command(label="test", command=lambda: print("clicked 'test'"))

print("Before post")
popup.post(200,200)  # Expecting print output from this (when clicked)
print("After post")

root.mainloop()
print("end of program")

Expected output:

Before post
clicked 'test'
After post
end of program

Actual output:

Before post
After post 
clicked 'test'   <--- Shouldn't this appear BEFORE previous line?
end of program

I've tried numerous things, without success, such as: popup.wait_window(), popup.update_idletasks(), popup.grab_release(), popup.unpost(), popup.destroy(), tk_popup (instead of Menu), etc.

Any advice would be appreciated.

clicked 'test' <--- Shouldn't this appear BEFORE previous line?

No, it shouldn't. The post only makes the menu appear, it will not wait for the user to select something from the menu. That's just not how tkinter menus are designed to work.

If you need your code to pause until the user makes a selection, you probably need to wait on a variable, and then make sure that all of the menu items set that variable.

I don't get that result on Linux, although apparently the command is supposed to execute. From the docs:

If a -command option is specified for a cascade entry then it is evaluated as a Tcl command whenever the entry is invoked.

My advice is don't try to trigger an event using another trigger. Instead, point both the menu command and whatever you are trying to do programmatically to the same target.

from tkinter import *

def func():
    print("clicked 'test'")

root = Tk()

popup = Menu(root, tearoff=0)
popup.add_command(label="test", command=func)
root['menu'] = popup
print("Before post")
func()
print("After post")

root.mainloop()
print("end of program")

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM