Вопрос

Я пишу некоторый код на python, и у меня возникают проблемы при попытке получить содержимое виджета ввода.Дело в том, что:Я хочу ограничить количество символов, которые можно вводить, поэтому я пытаюсь очистить виджет ввода, когда достигну определенного количества символов (в данном случае 2), но, похоже, я всегда пропускаю последний введенный символ.Я добавил потерянный символ в печать, чтобы показать.

Вот пример кода:

from Tkinter import *
class sampleFrame:
    def __init__(self, master):
        self.__frame = Frame(master)
        self.__frame.pack()
    def get_frame(self):
        return self.__frame


class sampleClass:
    def __init__(self, master):
        self.__aLabel = Label(master,text="aLabel", width=10)
        self.__aLabel.pack(side=LEFT)
        self.__aEntry = Entry (master, width=2)
        self.__aEntry.bind('<Key>', lambda event: self.callback(event, self.__aEntry))
        self.__aEntry.pack(side=LEFT)

    def callback(self, event, widgetName):
        self.__value = widgetName.get()+event.char
        print self.__value
        if len(self.__value)>2:
            widgetName.delete(2,4)





root = Tk()
aSampleFrame = sampleFrame(root)
aSampleClass = sampleClass(aSampleFrame.get_frame())
root.mainloop()

Любая помощь будет высоко оценена!

Заранее благодарю

Это было полезно?

Решение

Сначала, после того как вы выполните удаление, событие продолжит свою обычную обработку, т.е.символ будет вставлен.Вам нужно сообщить Tkinter, что событие следует проигнорировать.

Итак, в вашем приведенном выше коде добавьте отмеченную строку:

if len(self.__value) > 2:
    widgetName.delete(2,4)
    return "break" # add this line

С другой стороны, зачем вы проходите через лямбду?Событие имеет атрибут .widget, который вы можете использовать.Таким образом, вы можете изменить свой код на:

    self.__aEntry.bind('<Key>', self.callback) # ※ here!
    self.__aEntry.pack(side=LEFT)

def callback(self, event):
    self.__value = event.widget.get()+event.char # ※ here!
    print self.__value
    if len(self.__value)>2:
        event.widget.delete(2,4) # ※ here!
        return "break"

Все измененные строки отмечены знаком "здесь!".

Другие советы

Чтобы быть немного более конкретным, виджеты Tk имеют так называемые "bindtags".Когда событие обрабатывается, рассматривается каждый bindtag в виджете, чтобы определить, имеет ли он привязку.Виджет по умолчанию будет иметь в качестве своих bindtags виджет, класс виджета, корневой виджет и "все".Таким образом, привязки к виджету будут выполняться раньше привязок по умолчанию.Как только ваша привязка будет обработана, вы можете предотвратить рассмотрение любых дальнейших тегов привязки, вернув "разрыв".

Последствия таковы:если вы создадите привязку к виджету, также могут сработать привязки класса, корневого окна и "всех".Кроме того, срабатывает любая привязка, которую вы прикрепляете к виджету до того, как привязка к классу, в котором используется поведение по умолчанию (например:происходит вставка символа).Важно знать об этом в ситуациях, когда вы, возможно, захотите обработать событие после поведения по умолчанию, а не до него.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top