Python tkinter label widget mouse over

11,174

Solution 1

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()

Solution 2

Event functions can be included in a class and strings for displaying can be defined by a constructor.

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()
Share:
11,174

Related videos on Youtube

Chris Aung
Author by

Chris Aung

Aerospace Student Learning Tkinter &amp; PyQt4

Updated on June 04, 2022

Comments

  • Chris Aung
    Chris Aung almost 2 years

    My objective is to change the text of label widget when the mouse move over the label.For one label i would do something like this:

    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()
    

    But now, i have a bunch of labels which is generated by for loop and a list which contains the text that i want to change.

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

    This will generate 5 labels with numbers. Is it possible to add mouse over event for each individual label so that when i mouse over on the label 1, it changes to 'a', when i mouse over to label 2, it changes to 'b', etc? FYI, the number of items in the mylist will always be the same with the number used in for loop.

  • A. Rodas
    A. Rodas almost 11 years
    @ChrisAung It uses the actual x of the iteration for the lambda function. Otherwise, it will show "e" for all the labels.