2013-05-21 68 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() 

但現在,我有一個一堆由for循環產生的標籤和一個包含我想要改變的文本的列表。

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'等?僅供參考,mylist中的項目數量將始終與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它使用lambda函數迭代的實際'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()