0

Windows Calc のコピーを作成中に Entry ウィジェットに問題が発生しました。

Windows calc のようなボタンを作成し、キーボードの 1234567890 + - / * % ボタンをバインドして、calc ボタンと同じものを作成しました。主な問題は、エントリに数値のみを保存し、ユーザーに数値のみを入力させたいということでした...しかし、validatecommand に関する多くのトピックを検索し、Windows calc を見た後、validatecommand は必要なものではないと判断しました。ユーザーが入力ボックスに入力するすべての文字を検証する方法がわからず、キーボードバインドを作成した後、入力ボックスにいて「1」を押して数字を書き込むと、キーボードイベントバインディングが挿入されるため、2回実行されますエントリーボックスにも「1」。

それで、私が作りたいのは、入力ウィジェットを Windows Calc.exe の入力ボックスのように機能させることです。Windows の計算入力ボックスでは、数字以外の文字を挿入することはできません。また、入力ボックスにカーソルを置くこともできません...、次のようになります: -entrybox は無効ですが、有効になっているようです -数値と操作は、計算ボタンまたはキーボード ボタンで行うことができます

開始時にエントリ ウィジェットを無効にして、すべてのボタンを次のように機能させることで、この効果を得ようとしました。何かを挿入できるようにします) - エントリ ウィジェットを無効にします

それは私が望むように動作します...しかし、私が見たいようには見えません。Entry ウィジェットが無効になっている bg の色を通常の色に変更する可能性はありますか? または、そのようなエントリーボックスを作成する別の方法はありますか? :S

4

1 に答える 1

2

それを行う方法は、エントリ ウィジェットのvalidatecommandおよびオプションを使用することです。validateこのシナリオは、まさにこれらの機能の目的です。

「ユーザーが入力ボックスに入力したすべての文字を検証する方法がわからない」とあなたは言います。validate属性をに設定する"key"と、キーを押すたびに検証コマンドが呼び出されます。

残念ながら、これは Tkinter の機能として十分に文書化されていませんが、Tk については十分に文書化されています。以下は、いくつかの非常に基本的なチェックを実行する実際の例です。

import Tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        # define a command to be called by the validation code.  %P
        # represents the value of the entry widget if the edit is
        # allowed. We want that passed in to our validation comman so
        # we can validate it. For more information see
        # http://tcl.tk/man/tcl8.5/TkCmd/entry.htm#M7
        vcmd = (self.register(self._validate), '%P')
        e = tk.Entry(self, validate="key", validatecommand=vcmd)
        e.pack()

    def _validate(self, P):
        # accept the empty string, "." or "-." (to make it possible to
        # enter something like "-.1"), or any string that can be
        # converted to a floating point number.
        try:
            if P in (".", "-", "-.", ""):
                return True
            n = float(P)
            return True
        except:
            self.bell()
            return False

app=SampleApp()
app.mainloop()

このサイトを検索すると、他に[tkinter] validatecommandも多くの例が見つかります。

于 2012-08-20T17:10:12.007 に答える