帮助python Entry小部件中的<key>事件</key>

时间:2008-10-15 23:35:52

标签: python events widget tkinter

我在python中编写了一些代码,在尝试检索Entry小部件的内容时遇到了麻烦。 问题是:我想限制可以输入的字符,所以当我达到特定的字符数(在这种情况下为2)时,我正在尝试清除Entry小部件,但看起来我总是想念最后输入的字符字符。我在打印中添加了丢失的字符以显示。

以下是示例代码:

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()

非常感谢任何帮助!

提前致谢

2 个答案:

答案 0 :(得分:3)

首先,在删除之后,事件继续进行正常处理,即插入字符。您需要向Tkinter发出信号,告知该事件应该被忽略。

因此,在上面的代码中,添加标记的行:

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

另一方面,你为什么要经历lambda?事件具有可以使用的.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"

所有更改的行都标有“here!”

答案 1 :(得分:1)

更具体一点,Tk小部件有所谓的“bindtags”。处理事件时,将考虑窗口小部件上的每个绑定标签,以查看它是否具有绑定。默认情况下,窗口小部件将具有窗口小部件,窗口小部件类,根窗口小部件和“全部”的绑定标记。因此,在窗口小部件的绑定将在默认绑定之前发生。处理完绑定后,您可以通过返回“中断”来阻止任何进一步的绑定标记。

结果如下:如果您对窗口小部件进行绑定,则类,根窗口和“所有”绑定也可能会触发。此外,您附加到窗口小部件的任何绑定都会在类绑定之前触发,这是默认行为(例如:插入字符)的位置。在您可能希望在默认行为之后而不是之前处理事件的情况下,请务必注意这一点。