繁体   English   中英

更新后,绑定到StringVar的Tkinter标签只需点击一下即可

[英]Tkinter Label bound to StringVar is one click behind when updating

我遇到的问题是,当我点击Listbox框中的不同文件名时, 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>>是更好的解决方案,我不会详细介绍如何修改bindtags,虽然它是直截了当的,我认为相当充分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM