#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
для трех меток, поэтому после цикла forl
будет ссылаться на последнюю метку. Вы можете использовать список для хранения трех меток и доступа к соответствующей метке внутри трех функций.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
, это было бы более очевидно и меньше походило на черную магию