1

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

どんな助けでも大歓迎です!

前もって感謝します

4

2 に答える 2

3

最初に、削除を行った後、イベントは通常の処理で続行されます。つまり、文字が挿入されます。イベントを無視する必要があることを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"

変更されたすべての行には「ここ!」のマークが付いています。

于 2008-10-16T00:30:58.950 に答える
1

もう少し具体的に言うと、Tkウィジェットには「バインドタグ」と呼ばれるものがあります。イベントが処理されると、ウィジェットの各バインドタグが考慮され、バインディングがあるかどうかが確認されます。デフォルトでは、ウィジェットのバインドタグとして、ウィジェット、ウィジェットクラス、ルートウィジェット、および「すべて」が含まれます。したがって、ウィジェットへのバインディングは、デフォルトのバインディングの前に発生します。バインディングが処理されると、「ブレーク」を返すことで、それ以上のバインドタグが考慮されないようにすることができます。

影響は次のとおりです。ウィジェットでバインディングを作成すると、クラス、ルートウィンドウ、および「すべての」バインディングも起動する可能性があります。さらに、ウィジェットにアタッチするバインディングは、デフォルトの動作(文字の挿入など)が発生するクラスバインディングの前に起動します。イベントを処理する前ではなく、デフォルトの動作の後でイベントを処理したい場合があることに注意することが重要です。

于 2008-10-22T14:06:30.483 に答える