Как мне заставить свои функции настраивать правильные метки в tkinter в следующем коде?

#python #tkinter #label

#python #tkinter #метка

Вопрос:

Я могу сделать это, когда я индивидуально создаю метки, чтобы каждая функция настраивала метку рядом с кнопкой, с которой она вызывается. Когда я пытаюсь создать метки с помощью zip, все функции настраивают последнюю метку. Я чувствую, что где-то пропускаю шаг. Как я могу сделать это так, чтобы каждая функция настраивала правильную метку без необходимости создавать каждую метку отдельно?

 from tkinter import *

root = Tk()
root.configure(bg='light blue', height=1200, width=1200)

left_frame = Frame(root, width=250, height=500, bg='grey')
left_frame.place(x=10, y=10, relx=0.01, rely=0.01,)

def Create_Test():
    l.configure(text='Test result number 1')
def Create_test2():
    l.configure(text="Test result number 2")
def Create_test3():
    l.configure(text="Test result number 3")

text=['butt1', 'butt2', 'butt3','butt4']
Comm=[Create_Test, Create_test2, Create_test3]

for t,z in zip( text, Comm):
    butt=Button(left_frame, text=t, width=12, bg='red', fg='black', command=z, relief='ridge')
    butt.pack(side=TOP)

labels = ['Label1', 'Label2', 'Label3']
ys = [20, 47, 74]

for l,z in zip(labels,ys):
    l=Label(root, text="", width=25, bg='blue', fg='black',relief='ridge')
    l.place(x=125, y=z)

root.mainloop()
  

Комментарии:

1. Вы использовали одну и ту же переменную l для трех меток, поэтому после цикла for l будет ссылаться на последнюю метку. Вы можете использовать список для хранения трех меток и доступа к соответствующей метке внутри трех функций.

2. Спасибо. Мне удалось заставить все работать после прочтения вашего комментария. Я ценю помощь.

Ответ №1:

Попробуйте немного лямбда-магии

Изменить

 butt=Button(left_frame, text=t, width=12, bg='red', fg='black', command=z, relief='ridge')
  

Для

 butt=Button(left_frame, text=t, width=12, bg='red', fg='black', command=lambda z=z(): z, relief='ridge')
  

Обратите внимание, что вы также неправильно пытаетесь изменить текст ваших меток. Вы повторно используете l для обозначения многих разных вещей в своем коде. Приведенный ниже пример дает вам способ сохранить каждую из меток в словаре, чтобы вы могли изменить их содержимое позже

 from tkinter import *

root = Tk()
root.configure(bg='light blue', height=1200, width=1200)

left_frame = Frame(root, width=250, height=500, bg='grey')
left_frame.grid()

def Create_Test():
    print(1)
    label_dict['Label1'].configure(text='Test result number 1')
def Create_test2():
    print(2)
    label_dict['Label2'].configure(text="Test result number 2")
def Create_test3():
    print(3)
    label_dict['Label3'].configure(text="Test result number 3")

text=['butt1', 'butt2', 'butt3']
labels = ['Label1', 'Label2', 'Label3']
Comm=[Create_Test, Create_test2, Create_test3]

label_dict = {}

for idx,(button_text,label_text,fcn) in enumerate(zip(text,labels, Comm)):
    butt=Button(left_frame, text=button_text, width=12, bg='red', fg='black', command=lambda z=fcn:z(), relief='ridge')
    butt.grid(row=idx,column=0)
    currentLabel=Label(left_frame, text="", width=25, bg='blue', fg='black',relief='ridge')
    currentLabel.grid(row=idx,column=1)
    label_dict[label_text] = currentLabel


root.mainloop()
  

Я использовал .grid вместо вашего текущего сочетания place и pack . Также у меня есть один цикл для рисования кнопок и меток, поскольку вы можете объединить более 2 итераций вместе.

Комментарии:

1. Спасибо Скотти. Я очень новичок в этом, и в вашем ответе есть несколько интересных вещей, которые я раньше не изучал. С нетерпением жду возможности попробовать.

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