我遇到的问题是,当我点击列表框中的不同文件名时,标签会在我正在点击的任何内容后面点击一次.
我在这里错过了什么?
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()
解决方法:
问题与Tk的基本设计有关.简短版本是,在窗口小部件的默认类绑定之前触发特定窗口小部件的绑定.在类绑定中,列表框的选择被更改.这正是您所观察到的 – 您在当前点击之前看到了选择.
最佳解决方案是绑定到虚拟事件<<< ListboxSelect>>在选择发生变化后触发.其他解决方案(Tk独有的,它赋予它一些令人难以置信的功能和灵活性)是修改绑定应用的顺序.这涉及在类绑定标记之后移动窗口小部件绑定标记,或者在类绑定标记之后添加新的绑定标记并将其绑定到该标记.
由于绑定到<<< ListboxSelect>>是更好的解决方案我不会详细介绍如何修改bindtags,虽然它是直截了当的,我认为相当好.