0

Python / Tkinterアプリの「設定」フレームを設計しています。これにより、ユーザーはIPアドレス、ポート番号、およびその他の構成可能なオプションをいくつか指定できます。ユーザーがフレームを閉じて適用する前に、ユーザーエントリを検証したいと思います。

Entryウィジェットvalidateとオプションについてこれまでに読んだ(そして試した)ことに基づいて、validatecommandそれらが提供する唯一の選択肢は「手間のかかる」検証です。エントリが有効になるまで、ユーザーがエントリウィジェットを離れること(またはそれ以上のキーストロークを入力することさえ)をブロックされる種類。これは、GUIを設計するときに私が避けている動作とまったく同じです。これは、ユーザーにとってすべての問題が発生するため、煩わしいためです。

.traceメソッドを使用して値を監視するように切り替え、フレーム内のすべてのエントリが有効になるまで[OK/適用]ボタンを無効にすることを計画しています。ただし、その前に、組み込みの検証オプションに関して何かが足りないかどうかを知りたいと思いました。私が逃したオプションで、それほど手間がかからないものはありますか?

4

3 に答える 3

2

「重い利き手」なしで検証機能を使用できます。[OK]/[適用] ボタンの状態を設定した後、検証で常に True が返されるようにします。

于 2012-12-27T14:56:13.197 に答える
1

これを行うべきかどうかはわかりませんが、すべてが正常であるかinvalidcommandのようにエントリを処理するハンドラーをアタッチできます。

スクリプト例:

import Tkinter as tk

def onvalidate(d,i,P,s,S,v,V,W):
    # only lowercase is valid
    valid = (P.lower() == P)
    # set red background if invalid
    newcolor = 'red' if not valid else default_color
    root.nametowidget(W).configure(background=newcolor)
    return valid

def oninvalid(d,i,P,s,S,v,V,W):
    #called if widget is invalid
    widget = root.nametowidget(W)
    # S is the character that *would* have been
    # inserted or deleted, but won't because it is invalid
    # So we do it ourselves
    if S:
        if d=='0':
            widget.delete(i, len(S))
        elif d=='1':
            widget.insert(i, S)
    # Changing the text clears the 'validate' value
    # so we have to reset it
    widget.after_idle(lambda W,v: root.nametowidget(W).configure(validate=v), W, v)

root = tk.Tk()

valhook = (root.register(onvalidate), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
invhook = (root.register(oninvalid), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')

entry = tk.Entry(root, validate="key", validatecommand=valhook, invalidcommand=invhook)

default_color = entry.cget('background')

entry.pack()

root.mainloop()

これにより、無効な場合は背景が赤になり、そうでない場合は背景が白になるエントリが作成されますが、エントリが無効であっても、テキストは挿入または削除されます。

于 2012-12-27T17:27:44.773 に答える
1

トレースを使用すると、Tkinterの検証をまったく使用しなくても、必要なものを手に入れることができます。すべてのトレースを同じ関数に移動させ、必要に応じてすべての値をテストおよび検証し、それに応じて[OK]ボタンを有効または無効にします。

于 2012-12-27T13:51:47.003 に答える