2016-12-06 73 views
0

- 編輯:我目前的嘗試,很醜陋顯示在Tkinter的標籤上相應的消息

import tkinter as tk 

class Example(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 


     self.labelLists = [] 
     self.labelBLists = [] 

     self.Label1 = tk.Label(self,text=str(1),bg="red") 
     self.Label1.pack() 
     self.Label1.bind("<Enter>", self.on_enter1) 
     self.Label1.bind("<Leave>", self.on_leave1) 
     self.Labela = tk.Label(self,text="",bg="blue") 
     self.Labela.pack() 

     self.Label2 = tk.Label(self,text=str(2),bg="red") 
     self.Label2.pack() 
     self.Label2.bind("<Enter>", self.on_enter2) 
     self.Label2.bind("<Leave>", self.on_leave2) 
     self.Labelb = tk.Label(self,text="",bg="blue") 
     self.Labelb.pack() 

     self.Label3 = tk.Label(self,text=str(3),bg="red") 
     self.Label3.pack() 
     self.Label3.bind("<Enter>", self.on_enter3) 
     self.Label3.bind("<Leave>", self.on_leave3) 
     self.Labelc = tk.Label(self,text="",bg="blue") 
     self.Labelc.pack() 


    def on_enter1(self, event): 
     self.Labela.config(text=self.Label1.cget("text")) 

    def on_leave1(self, enter): 
     self.Labela.config(text="") 

    def on_enter2(self, event): 
     self.Labelb.config(text=self.Label2.cget("text")) 
    def on_leave2(self, enter): 
     self.Labelb.config(text="") 
    def on_enter3(self, event): 
     self.Labelc.config(text=self.Label3.cget("text")) 
    def on_leave3(self, enter): 
     self.Labelc.config(text="") 

if __name__ == "__main__": 
    root = tk.Tk() 
    Example(root).pack(side="top", fill="both", expand="true") 
    root.mainloop() 

我要創建一組標籤,說L1,L2,L3,而且每一個都有一個對應的標籤La,Lb,Lc。我想要做的是當我將鼠標懸停在L1上時,La在L1上顯示單詞的翻譯。目前我在尋找Display message when going over something with mouse cursor in PythonPython Tkinter: addressing Label widget created by for loop,但他們都沒有地址綁定相應的方法。有沒有一種方法可以實現這一點,而無需創建三對不同的方法?

謝謝!

+0

你的嘗試在哪裏? – TigerhawkT3

回答

1

將每組標籤存儲在一個列表中。然後,您可以將它們與翻譯字典一起瀏覽,並將次要標籤(顯示翻譯)連接到主要標籤(響應用戶輸入)。這允許您創建一個單一的enter方法和一個單一的leave方法,使用event.widget訪問觸發事件的小部件。

import tkinter as tk 

class Example(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
     self.translations = {'a':'A', 'b':'B', 'c':'C'} 

     self.labelLists = [tk.Label(self,text=str(x),bg="red") for x in range(1,4)] 
     self.labelBLists = [tk.Label(self,text="",bg="blue") for x in range(3)] 
     for x,y,tr in zip(self.labelLists, self.labelBLists, sorted(self.translations)): 
      x.bind('<Enter>', self.enter) 
      x.bind('<Leave>', self.leave) 
      x.connected = y 
      x.key = tr 
      x.pack() 
      y.pack() 

    def enter(self, event): 
     widget = event.widget 
     widget.connected.config(text=self.translations[widget.key]) 

    def leave(self, event): 
     widget = event.widget 
     widget.connected.config(text='') 

if __name__ == "__main__": 
    root = tk.Tk() 
    Example(root).pack(side="top", fill="both", expand="true") 
    root.mainloop() 
+0

我不太明白翻譯在這裏的工作方式,你能解釋一下嗎? – angieShroom

+1

@angieShroom - 正如這爲每個「x」小部件指定一個連接的「y」小部件「連接」的屬性,它也指定了一個'tr'鍵'key'的屬性。該屬性被用作查找'self.translations'中對應值的關鍵字。 – TigerhawkT3