Ссылка на соседний текст метки - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь написать функцию для печати текста на этикетке, соответствующей соседней кнопке. У меня проблемы с этим. Я хотел бы напечатать «a», если я нажму первую кнопку, «b», если я нажму вторую кнопку, и «c», если я нажму третью кнопку. Как мне разработать код, чтобы кнопки знали, какую этикетку следует печатать?

import tkinter as tk
from tkinter import *
from tkinter import ttk

dummylist = ["a","b","c"]

root = tk.Tk()

def print_dummylistvar():
    print(lbl)


for x in range(len(dummylist)):
    lbl = Label(root, text=dummylist[x])
    lbl.grid(column=0, row=x)
    button = tk.Button(root, text='Print', command=print_dummylistvar)
    button.grid(column=1, row=x)

root.mainloop()

1 Ответ

1 голос
/ 08 мая 2020

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

command=lambda:print_dummylistvar(lbl)

Но поскольку вы создаете много меток в l oop, вам также понадобится arg=lbl для копирования ссылки из lbl в новую переменную.

command=lambda arg=lbl:print_dummylistvar(arg)

Без этого все кнопки будут использовать ссылку на одну и ту же этикетку - последняя метка, созданная в for -l oop

Это нужно будет напечатать lbl['text']

def print_dummylistvar(widget):
    print(widget['text'])

Рабочий код

import tkinter as tk
#from tkinter import * # PEP8: `import *` is not preferred
from tkinter import ttk

# --- functions ---

def print_dummylistvar(widget):
    print(widget['text'])

# --- main ---

dummylist = ["a", "b", "c"]

root = tk.Tk()

for number, text in enumerate(dummylist):
    lbl = tk.Label(root, text=text)
    lbl.grid(column=0, row=number)
    button = tk.Button(root, text='Print', command=(lambda arg=lbl:print_dummylistvar(arg)))
    button.grid(column=1, row=number)

root.mainloop()

BTW: Вместо ссылки на этикетку вы также можете использовать текст

button = tk.Button(root, text='Print', command=(lambda arg=text:print_dummylistvar(arg)))

и он получает текст вместо метки, поэтому ему не нужно lbl['text']

def print_dummylistvar(text):
    print(text)

import tkinter as tk
from tkinter import ttk

# --- functions ---

def print_dummylistvar(text):
    print(text)

# --- main ---

dummylist = ["a", "b", "c"]

root = tk.Tk()

for number, text in enumerate(dummylist):
    lbl = tk.Label(root, text=text)
    lbl.grid(column=0, row=number)
    button = tk.Button(root, text='Print', command=(lambda arg=text:print_dummylistvar(arg)))
    button.grid(column=1, row=number)

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