Метка Tkinter, привязанная к StringVar, находится на расстоянии одного клика при обновлении - PullRequest
4 голосов
/ 28 мая 2010

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я нажимаю на разные имена файлов в 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()

1 Ответ

4 голосов
/ 28 мая 2010

Проблема связана с фундаментальным дизайном Тк. Краткая версия: привязки для определенных виджетов срабатывают до привязок классов по умолчанию для виджета. Именно в привязках класса выбор списка изменяется. Это именно то, что вы наблюдаете - вы видите выбор перед текущим кликом.

Лучшее решение - привязка к виртуальному событию <<ListboxSelect>>, которое запускается после изменения выбора. Другие решения (уникальные для Tk и придающие ему невероятную мощность и гибкость) - это изменение порядка применения привязок. Это включает перемещение тега привязки виджета после класса привязки или добавление нового тега привязки после класса привязки и его привязку к нему.

Поскольку привязка к <<ListboxSelect>> является лучшим решением, я не буду вдаваться в подробности о том, как модифицировать привязки, хотя это просто и, я думаю, довольно хорошо задокументировано.

...