Как напечатать соответствующие названия флажков, когда они отмечены в tkinter? - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу напечатать соответствующие имена флажков в консоли, когда флажок установлен.

Например, когда я отмечаю флажок «COPYRIGHT»:

Что я хочу напечатать: «copyright»

Что печатается: «creation»

Я обнаружил, что когда я заменяю создание другими элементами metadata_list, этот недавно замененный элемент всегда распечатывается. В общем, последний элемент списка metadata_list всегда печатается функцией temp () независимо от того, какой флажок я отмечаю. Я думаю, что происходит какое-то хулулулу, когда я передаю «ключ» в качестве команды в функции.

Но правильное значение ключа отображается, когда ключ печатается извне функции temp (), как если бы она была внутри для l oop. Что я здесь не так делаю?

Это основной файл:

import tkinter as tk
import variable_container as vc

metadata_frame = tk.Tk()

def temp(key):
    print(key)

for key,i in vc.metadata_list.items():
    i[1] = tk.IntVar()
    tk.Checkbutton(metadata_frame, text = key.upper(), variable = i[1], command = lambda: temp(key)).grid(row = i[0])
    print(key)

metadata_frame.mainloop()

А это файл variable_container.py:

# Values are the row information and respective checkbox variables
metadata_list = {
    'copyright': [0, var_copyright],
    'location': [1, var_location],
    'creation': [2,var_creation]
}

1 Ответ

0 голосов
/ 29 апреля 2020

Вам нужно передать параметр в лямбда-функцию, иначе лямбда будет выполнена с использованием ссылки на ключ. В момент выполнения лямбды значение ключа составляет creation. Если вы передаете параметр, значение ключа копируется как параметр

tk.Checkbutton(metadata_frame, text = key.upper(), variable = i[1], command = lambda param = key: temp(param)).grid(row = i[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...