< key>のヘルプPython Entryウィジェットのイベント
質問
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"
変更されたすべての行には&quot; here!&quot;のマークが付いています
他のヒント
もう少し具体的に言うと、Tkウィジェットには「バインドタグ」と呼ばれるものがあります。イベントが処理されると、ウィジェット上の各バインドタグが考慮され、バインディングがあるかどうかが確認されます。デフォルトでは、ウィジェットはバインドタグとしてウィジェット、ウィジェットクラス、ルートウィジェット、および「すべて」を持ちます。したがって、ウィジェットへのバインドは、デフォルトのバインドの前に発生します。バインディングが処理されると、&quot; break&quot;を返すことにより、それ以上のbindtagが考慮されないようにすることができます。
結果は次のとおりです。ウィジェット、クラス、ルートウィンドウ、および「すべて」にバインディングを作成すると、バインディングも起動する場合があります。さらに、ウィジェットにアタッチしたバインディングは、デフォルトの動作(例:文字の挿入)が発生するクラスバインディングの前に起動します。前よりもデフォルトの動作の後にイベントを処理したい場合に、そのことに注意することが重要です。