Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python条目小部件中事件的帮助_Python_Events_Widget_Tkinter - Fatal编程技术网

python条目小部件中事件的帮助

python条目小部件中事件的帮助,python,events,widget,tkinter,Python,Events,Widget,Tkinter,我正在用python编写一些代码,在尝试检索条目小部件的内容时遇到了问题。 问题是:我想限制可以键入的字符数,所以在本例中,当我达到特定的字符数2时,我尝试清除Entry小部件,但看起来我总是错过最后键入的字符。我在印刷品中添加了丢失的字符以显示 以下是示例代码: from Tkinter import * class sampleFrame: def __init__(self, master): self.__frame = Frame(master)

我正在用python编写一些代码,在尝试检索条目小部件的内容时遇到了问题。 问题是:我想限制可以键入的字符数,所以在本例中,当我达到特定的字符数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()
任何帮助都将不胜感激


提前感谢

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

所有更改的行都在此处标记为

首先,在执行删除操作后,事件将继续正常处理,即插入角色。您需要向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"

所有更改的行都在此处标记为

更具体地说,Tk小部件有所谓的bindtags。处理事件时,会考虑小部件上的每个bindtag,以查看它是否具有绑定。默认情况下,小部件的bindTag包括小部件、小部件类、根小部件以及所有内容。因此,对小部件的绑定将发生在默认绑定之前。处理完绑定后,您可以通过返回中断来防止考虑任何进一步的bindtags


其后果是:如果在小部件上进行绑定,那么类、根窗口和所有绑定也可能触发。此外,附加到小部件的任何绑定都会在类绑定之前触发,而类绑定是默认行为(例如:插入字符)发生的地方。重要的是要注意,在您可能希望在默认行为之后而不是之前处理事件的情况下。

更具体地说,Tk小部件具有所谓的bindtags。处理事件时,会考虑小部件上的每个bindtag,以查看它是否具有绑定。默认情况下,小部件的bindTag包括小部件、小部件类、根小部件以及所有内容。因此,对小部件的绑定将发生在默认绑定之前。处理完绑定后,您可以通过返回中断来防止考虑任何进一步的bindtags

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