Как получить, какой пункт меню вызвал обратный вызов? - PullRequest
0 голосов
/ 09 сентября 2018

Я хотел бы иметь одну функцию обратного вызова для моего меню. Чтобы определить, какое действие необходимо выполнить в обратном вызове, мне нужно знать, какой пункт меню генерировал обратный вызов. Я не смог понять это.

Я вижу опцию с именем «переменная» в вызове add, но когда я пытаюсь ее использовать, я получаю ошибку. Я подумал, что, возможно, это позволит мне указать StringVar, в котором будет храниться текст меню.

Хотелось бы узнать в функции hello, кто сгенерировал обратный вызов. Можно ли указать параметр, который можно передать?

from tkinter import *

root = Tk()

def hello():
    print ("hello!")

# create a toplevel menu
menubar = Menu(root)
menubar.add_command(label="Hello!", command=hello)
menubar.add_command(label="Quit!", command=hello)

# display the menu
root.config(menu=menubar)

mainloop()

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Вопрос был опубликован:

Хотелось бы узнать в функции hello, кто сгенерировал обратный вызов. Можно ли указать параметр, который можно передать?

После небольшого исследования я выяснил, как для моей функции узнать, кто ее вызвал. Это был хитрый код, чем я ожидал.

Используемая строка кода:

    top_menu.add_command(label=sub_menu_info, command=lambda: Menu.MenuItemChosenCallback(element, sub_menu_info))

Я раньше не использовал лямбду, так что синтаксис меня выбрасывал. У меня есть метод в моем классе «Меню» с именем MeduItemChosenCallback. Он объявлен так:

def MenuItemChosenCallback (self, item_chosen):

Я не осознавал, что мне нужно поместить имя класса в функцию в лямбда-выражении. Я думал, что это будет element.MenuItemChosenCallback, поскольку эта переменная является объектом Menu. Опять же, раньше не использовали лямбду, поэтому нужно было проработать синтаксис.

Используя исходный код примера, определение, кто совершил вызов hello, было выполнено с параметром:

from tkinter import *

root = Tk()

def hello(parm):
    print (parm)

# create a toplevel menu
menubar = Menu(root)
menubar.add_command(label="Hello!", command= lambda: hello('1'))
menubar.add_command(label="Quit!", command=lambda: hello('2'))


# display the menu
root.config(menu=menubar)

mainloop()
0 голосов
/ 10 сентября 2018

Возможно, лучшее решение для каждой команды - вызывать разные функции.

menubar.add_command(label="Hello!", command=menu_hello)
menubar.add_command(label="Quit!", command=menu_quit)

Если вам нужно, чтобы несколько пунктов меню вызывали одну и ту же команду, обычно используйте lambda или functools.partial :

Пример:

menubar.add_command(label="Hello!", command=lambda: hello("1"))
menubar.add_command(label="Quit!", command=lambda: hello("2"))
0 голосов
/ 09 сентября 2018

Прежде всего, избегайте импорта звездочек. Вы можете импортировать его под другим именем, чтобы сделать его менее типичным.

import tkinter as tk

command в меню ничего не возвращает. Вы можете использовать lambda или создавать отдельные функции.


Использование lambda:

root = tk.Tk()

# create a toplevel menu
menubar = tk.Menu(root)
menubar.add_command(label="Hello!", command=lambda:print("Hello!"))
menubar.add_command(label="Quit!", command=lambda:print("hello!"))

# display the menu
root.config(menu=menubar)

root.mainloop()

Когда вы нажимаете меню Hello!, оно печатает Hello!, но когда вы нажимаете Quit!, оно печатает hello!


Использование отдельных функций:

root = tk.Tk()
def hello():   #Hello! menu
    print("hello!")
def Hello():   #Quit! menu
    print("Hello!")
# create a toplevel menu
menubar = tk.Menu(root)
menubar.add_command(label="Hello!", command=hello)
menubar.add_command(label="Quit!", command=Hello)

# display the menu
root.config(menu=menubar)

root.mainloop()

Вы можете сделать отдельные функции для идентификации обратного вызова меню.

Создание 3 функций:

Вы можете сделать 3 функции. Одна будет основной, которую вы будете вызывать в двух других функциях. Это поможет вам определить меню. Вот пример:

root = tk.Tk()
def _main():
    print("hello!")
def hello():   #Hello! menu
    _main()
def Hello():   #Quit! menu
    _main()

# create a toplevel menu
menubar = tk.Menu(root)
menubar.add_command(label="Hello!", command=hello)
menubar.add_command(label="Quit!", command=Hello)

# display the menu
root.config(menu=menubar)

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...