문제

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"가 있습니다. 이벤트가 처리되면, 위젯의 각 바인 타그는 바인딩이 있는지 확인하기 위해 고려됩니다. 기본적으로 위젯은 위젯, 위젯 클래스, 루트 위젯 및 "모두"를 바인 타그로 사용합니다. 따라서 위젯에 대한 바인딩은 기본 바인딩 전에 발생합니다. 바인딩이 처리되면 "브레이크"를 반환하여 더 이상의 바인 타그가 고려되는 것을 방지 할 수 있습니다.

파급 효과는 다음과 같습니다. 위젯, 클래스, 루트 창 및 "모든"바인딩에도 바인딩이 발생하면 발사 될 수 있습니다. 또한 위젯 화재에 부착 된 바인딩 ~ 전에 기본 동작 (예 : 캐릭터 삽입)이 발생하는 클래스 바인딩. 이전이 아닌 기본 동작 후에 이벤트를 처리하려는 상황에서도 알고 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top