2017-02-25 3 views
0

python 2.7 및 Tkinter 사용. 루프에 네 개의 lables를 만들고 바인딩하고 있습니다. 레이블에서 레이블 이름에 을 반환하도록합니다. 문제는 내가 어떤 레이블을 눌러도 마지막 레이블의 이름을 반환한다는 것입니다. 정확하게이 문제가있는 Python Tkinter: Bind function with labels in for loop이 발견되었지만 코드를 정확하게 복사해도 주어진 솔루션이 제대로 작동하지 않습니다. 누구든지 알려주세요. 여기 내 원래 코드입니다 :Tkinter 레이블이 적절한 값을 반환하지 않음

# labelbind.py 
from Tkinter import * 
root = Tk() 
root.title('Label choices') 
root.geometry('1160x900+650+50') 
root.option_readfile('setstyle2.txt') 

def lblpress(x): 
    print 'Label pressed', x 
names = ['AMEX', 'CIBC', 'VISA', 'BMO'] 
col = 150 
row = 45 
num = 1 
for name in names: 
    bobo = 'lbl' + str(num) 
    print bobo, name  
    bobo = Label(root, text = name) 
    bobo.bind('<ButtonRelease-1>', lambda x = name : lblpress(name)) 
    bobo.place(x = col, y = row) 
    row += 40 
    num += 1 

root.mainloop() 

답변

2

콜백에 아무것도 전달할 필요가 없습니다. 콜백에 제공되는 이벤트 객체에는 위젯에 대한 참조가 포함되어 있으며 위젯에는 텍스트를 가져올 수 있습니다.

예를 들어

:

import Tkinter as tk 

def lblpress(event): 
    print 'Label pressed:', event.widget.cget("text") 

root = tk.Tk() 

names = ['AMEX', 'CIBC', 'VISA', 'BMO'] 
for name in names: 
    label = tk.Label(root, text=name) 
    label.bind("<ButtonRelease-1>", lblpress) 
    label.pack(side="top") 

root.mainloop() 
+0

@ 브라이언 오클리; 나는 당신이 대답 할 것이고 당신이 내 문제를 해결했다는 것을 확신했습니다. Tkinter 문서는 사해 파피루스를 해독하려고하는 것과 같습니다 ... 많은 출처가 있으므로 일관성이 거의 없습니다. Muchas gracias! – Albert

관련 문제