【问题标题】:Help with <key> event in python Entry widgetpython Entry小部件中的<key>事件帮助
【发布时间】:2010-09-17 10:34:39
【问题描述】:

我正在用 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()

任何帮助将不胜感激!

提前致谢

【问题讨论】:

    标签: python events widget tkinter


    【解决方案1】:

    首先,在您进行删除后,事件会继续正常处理,即插入字符。您需要向 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"
    

    所有更改的行都标有“这里!”

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-27
        • 2020-10-01
        • 2014-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多