Обратный вызов виджета меню Python 3 Tkinter выглядит не по порядку - PullRequest
0 голосов
/ 06 ноября 2018

У меня проблемы с виджетом Tkinter Menu (без кнопки меню), из-за которого обратный вызов, кажется, работает не по порядку. Вот очень минимальный пример:

# 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")

Ожидаемый результат:

Before post
clicked 'test'
After post
end of program

Фактическая выработка:

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

Я безуспешно пробовал множество вещей, таких как: popup.wait_window (), popup.update_idletasks (), popup.grab_release (), popup.unpost (), popup.destroy (), tk_popup (вместо Меню) и др.

Любой совет будет оценен.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

нажал 'test' <--- Разве это не должно появиться ДО предыдущей строки? </p>

Нет, не должно. Сообщение только заставляет меню появиться, это не будет ждать пользователя, чтобы выбрать что-то из меню. Это просто не то, как меню tkinter предназначены для работы.

Если вам нужно, чтобы ваш код приостанавливался до тех пор, пока пользователь не сделает выбор, вам, вероятно, нужно подождать переменную, а затем убедиться, что все пункты меню задают эту переменную.

0 голосов
/ 06 ноября 2018

Я не получаю такой результат в Linux, хотя, очевидно, команда должна выполняться. Из документов:

Если для каскадной записи указана опция -command, то она оценивается как команда Tcl при каждом вызове записи.

Мой совет: не пытайтесь инициировать событие, используя другой триггер. Вместо этого наведите команду меню и все, что вы пытаетесь сделать программно, на одну и ту же цель.

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")
...