Ткинтер в Python, перечислим - PullRequest
0 голосов
/ 31 января 2020

Мне нужна твоя помощь. Я хочу сделать несколько этикеток. После щелчка номер на каждой этикетке должен измениться на текст, соответствующий номеру. Я попробовал это, но он просто меняет текст на каждом ярлыке на последний элемент в списке2. Что я должен сделать, чтобы это изменилось соответственно? Цифры и тексты находятся в одной и той же позиции в обоих списках.

import tkinter as tk

root = tk.Tk()

list1 = [["one", "two", "three", "four"], ["five", "six", "seven", "eight"],["nine","ten","eleven","twelve"]]
list2 = [["1","2","3","4"], ["5", "6", "7", "8"],["9", "10", "11", "12"]]

def change_label(event):
    for row, rowinlist in enumerate(list2):
        for column, text2 in enumerate(rowinlist):    
            event.widget.configure(text=text2)

for row, rowinlist in enumerate(list1):
    for column, text in enumerate(rowinlist):
        label = tk.Label(text=text, width=15, bd=1, relief="raised")
        label.grid(row=row, column=column)
        label.bind("<1>", change_label)
        x = text

root.mainloop()

1 Ответ

1 голос
/ 01 февраля 2020

Это потому, что вы go прошли через все элементы в list2 и установили для него текст event.widget, поэтому конечный результат - последний элемент list2.

. Вам нужно чтобы сохранить row и column каждой метки и использовать их для установки текста:

def change_label(event):
    row, col = event.widget.pos # get the position of clicked label
    event.widget.configure(text=list2[row][col])

for row, rowinlist in enumerate(list1):
    for column, text in enumerate(rowinlist):
        label = tk.Label(text=text, width=15, bd=1, relief="raised")
        label.grid(row=row, column=column)
        label.bind("<1>", change_label)
        label.pos = (row, column) # save the position of label
...