2013-05-21 3 views
2

Моя цель состоит в том, чтобы изменить текст этикетки виджет, когда перемещение мыши над label.For одной меткой я бы сделать что-то вроде этого:Python Tkinter ярлык виджет мыши над

import Tkinter as tk 

def fun1(event): 
    label.config(text="Haha") 
def fun2(event): 
    label.config(text="Label1") 

root=tk.Tk() 
label=tk.Label(root,text="Label1") 
label.grid(row=1,column=1) 
label.bind("<Enter>", fun1) 
label.bind("<Leave>", fun2) 
root.mainloop() 

Но теперь у меня есть кучу меток, создаваемых для цикла, и список, содержащий текст, который я хочу изменить.

mylist=['a','b','c','d','e'] 
for i in range(5): 
    tk.Label(root,text="Label"+str(i)).grid(row=i+1,column=1) 

Это сгенерирует 5 ярлыков с цифрами. Можно ли добавить событие мыши для каждого отдельного ярлыка, чтобы при наведении указателя мыши на метку 1 он менялся на «a», когда я наводил указатель на метку 2, он менялся на «b» и т. Д.? FYI, количество элементов в списке будет всегда совпадать с количеством, используемым в цикле for.

ответ

2
import Tkinter as tk 

root = tk.Tk() 
mylist = ['a','b','c','d','e'] 

for i, x in enumerate(mylist): 
    label = tk.Label(root, text="Label "+str(i)) 
    label.grid(row=i+1, column=1) 
    label.bind("<Enter>", lambda e, x=x: e.widget.config(text=x)) 
    label.bind("<Leave>", lambda e, i=i: e.widget.config(text="Label "+str(i))) 

root.mainloop() 
+0

спасибо, что это работает! но не могли бы вы объяснить, что означает «x = x»? –

+0

@ChrisAung Использует фактическую «x» итерации для функции лямбда. В противном случае для всех меток будет отображаться «e». –

1

Функции события могут быть включены в класс, а строки для отображения могут быть определены конструктором.

import Tkinter as tk 

class Labels(object): 
    def __init__(self,number,basicStr,onMouseStr): 
     self.i = number 
     self.basicStr = basicStr + str(number) 
     self.onMouseStr = onMouseStr 
     mylist=['a','b','c','d','e'] 
     self.label = tk.Label(root,text="Label"+str(i)) 
     self.label.grid(row=1+i,column=1) 
     self.label.bind("<Enter>", self.fun1) 
     self.label.bind("<Leave>", self.fun2) 
    def fun1(self,event): 
     self.label.config(text=self.basicStr) 
    def fun2(self,event): 
     self.label.config(text=self.onMouseStr) 
root=tk.Tk() 
labelsList = [] 
for i in range(5): 
    lab = Labels(i,"haha","label"+str(i)) 
    labelsList.append(lab) 
root.mainloop() 
Смежные вопросы