更新时绑定到 StringVar 的 Tkinter Label 落后一键

2023-12-09

我在这里遇到的问题是,当我单击中的不同文件名时Listbox, the Label在我当前单击的内容后面单击一下即可更改值。

我在这里缺少什么?

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>>是更好的解决方案,我不会详细介绍如何修改绑定标签,尽管它很简单,而且我认为有很好的文档记录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新时绑定到 StringVar 的 Tkinter Label 落后一键 的相关文章

随机推荐