2

入力ウィジェットを使用して 1 から 9 までの数字を取得したいと考えています。他のキーが押された場合は、表示から削除したいと考えています。

    def onKeyPress(event):
        if event.char in ['1', '2', '3', '4', '5', '6', '7', '8', '9']
            ...do something
            return

        # HERE I TRY AND REMOVE AN INVALID CHARACTER FROM THE SCREEN
        # at this point the character is:
        #   1) visible on the screen
        #   2) held in the event
        #   3) NOT YET in the entry widgets string
        # as the following code shows...
        print ">>>>", event.char, ">>>>", self._entry.get()
        # it appeARS that the entry widget string buffer is always 1 character behind the event handler

        # so the following code WILL NOT remove it from the screen...
        self._entry.delete(0, END)
        self._entry.insert(0, "   ")

    # here i bind the event handler    
    self._entry.bind('<Key>',  onKeyPress)

では、どうすれば画面をクリアできますか?

4

3 に答える 3

1

入力検証の方法が間違っています。あなたが投稿したコードでは、あなたが求めることはできません。1つは、ご存知のとおり、バインドすると<<Key>>、デフォルトでは、キャラクターがウィジェットに表示される前にバインドが開始されます。

回避策を提供することもできますが、正しい答えは、入力検証に組み込みの機能を使用することです。validatecommandエントリウィジェットのとvalidate属性を参照してください。tkinterでエントリウィジェットのコンテンツをインタラクティブに検証するという質問に対するこの回答は、その方法を示しています。その答えは、上位/下位に対して検証する方法を示していますが、有効な文字のセットと比較するためにそれを変更するのは簡単です。

于 2012-09-28T11:11:48.193 に答える
0
import Tkinter as tk

class MyApp():
    def __init__(self):
        self.root = tk.Tk()
        vcmd = (self.root.register(self.OnValidate), 
                '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
        self.entry = tk.Entry(self.root, validate="key", 
                              validatecommand=vcmd)
        self.entry.pack()
        self.root.mainloop()

    def OnValidate(self, d, i, P, s, S, v, V, W):
        # only allow integers 1-9
        if P == "":
            return True
        try:
            newvalue = int(P)
        except ValueError:
            return False
        else:
            if newvalue > 0 and newvalue < 10:
                return True
            else:
                return False

app=MyApp()

整数1〜9のみを許可するように検証を変更して、この回答から取得しました。

(その検証を書くためのより良い方法があると確信していますが、私が見る限り、それは仕事をします。)

于 2012-09-28T11:46:44.067 に答える