2010-05-28 29 views
4

我在這裏遇到的問題是,當我單擊Listbox中的不同文件名時,Label將更改值單擊後面的任何一個點擊我當前點擊上。綁定到StringVar的Tkinter標籤在更新時被點擊一次

缺少什麼我在這裏?

import Tkinter as tk 

class TkTest: 

    def __init__(self, master): 

     self.fraMain = tk.Frame(master) 
     self.fraMain.pack() 

     # Set up a list box containing all the paths to choose from 
     self.lstPaths = tk.Listbox(self.fraMain) 
     paths = [ 
      '/path/file1', 
      '/path/file2', 
      '/path/file3', 
     ] 
     for path in paths: 
      self.lstPaths.insert(tk.END, path) 
     self.lstPaths.bind('<Button-1>', self.update_label) 
     self.lstPaths.pack() 

     self.currentpath = tk.StringVar() 
     self.lblCurrentPath = tk.Label(self.fraMain, textvariable=self.currentpath) 
     self.lblCurrentPath.pack() 

    def update_label(self, event): 
     print self.lstPaths.get(tk.ACTIVE), 
     print self.lstPaths.curselection() 
     self.currentpath.set(self.lstPaths.get(tk.ACTIVE)) 

root = tk.Tk() 
app = TkTest(root) 
root.mainloop() 

回答

4

這個問題與Tk的基本設計有關。簡短版本是,在特定窗口小部件的默認類綁定之前,綁定特定窗口小部件。在類綁定中,列表框的選擇被改變了。這正是您所觀察到的 - 您在當前點擊之前看到選擇。

最好的解決方案是綁定到虛擬事件<<ListboxSelect>>,在選擇發生變化後觸發。其他解決方案(Tk獨特的功能和靈活性)是修改綁定應用的順序。這涉及到在類綁定標籤之後移動小部件綁定標籤,或者在類綁定標籤之後添加新的綁定標籤並將其綁定到該綁定標籤。

由於綁定到<<ListboxSelect>>是更好的解決方案,我不會詳細討論如何修改綁定標籤,儘管它很簡單,而且我認爲它有很好的文檔記錄。

+0

這樣做的竅門,謝謝!我還沒有看到任何在我經歷過的教程中的任何地方引用了<< ListboxSelect >>,甚至用Google搜索這個確切的單詞也沒有提供太多的信息。是否有所有虛擬活動的列表?這真的看起來像是一個令人討厭的'陷阱'在Tk ... – Sam 2010-05-28 18:30:31

+1

@Sam:沒有單一的所有事件的列表。 Tk手冊頁列出了該窗口小部件手冊頁上每個窗口小部件的事件。因此,例如,列表框手冊頁上列出了<< ListboxSelect >>:http://tcl.tk/man/tcl8.4/TkCmd/listbox.htm – 2010-05-28 20:50:27