0

私は現在 tkinter の基本を学んでおり、いくつかの最も基本的なウィジェットに関する知識をテストするために、小さくて非常に単純なプログラムを作成しています。

おそらく私の理解不足が原因で、検証とエントリで問題が発生しています... これには 3 つの疑問があります。

1 - ここで行われたことを行う方法: https://stackoverflow.com/a/4140988/2828287クラス部分なし。スクリプトの実行時にそれを行うだけです。

2 - それらすべての自己は何ですか。と.自分はそこにいる?それがクラスであるために存在するものと、検証メソッド自体のために存在するものはどれですか??

3 - コードのどこが間違っていますか? この説明に基づく >> http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/entry-validation.html

from tkinter import *
from tkinter import ttk

# function that should take the '%d' replacer and only validate if the user didn't delete
def isOkay(self, why):
    if why == 0:
        return False
    else:
        return True

okay = entry.register(isOkay) # didn't understand why I had to do this, but did it anyway...
entry = ttk.Entry(mainframe, validate="key", validatecommand=(okay, '%d'))
# the mainframe above is a ttk.Frame that contains all the widgets, and is the only child of the usual root [ = Tk()]
entry.grid(column=1,row=10) # already have lots of stuff on upper rows

私が得ているエラーは次のようになります: .register() のもの

--編集済みコード-- これでエラーは発生しませんが、削除は可能です...

def isOkay(why):
    if (why == 0):
        return False
    else:
        return True

okay = (**root**.register(isOkay), "%d")
entry = ttk.Entry(mainframe, validate="key", validatecommand=okay)
entry.grid(column=1,row=10)

('root' 部分が ** ** の間に書かれている場合、それはルートである必要がありますか? または、それを使用するウィジェットの任意の親である可能性がありますか? または、直接の親でなければなりませんか?たとえば、ルート >> メインフレーム >> エントリがあります。ルート、メインフレーム、または両方である必要がありますか?)

4

1 に答える 1

1

のすべての使用法selfは、クラスの使用によるものです。それらは検証とはまったく関係ありません。何もありません。

クラスを使用せず、検証関数を説明する長いコメントがない例を次に示します。

import Tkinter as tk

def OnValidate(d, i, P, s, S, v, V, W):
    print "OnValidate:"
    print "d='%s'" % d
    print "i='%s'" % i
    print "P='%s'" % P
    print "s='%s'" % s
    print "S='%s'" % S
    print "v='%s'" % v
    print "V='%s'" % V
    print "W='%s'" % W
    # only allow if the string is lowercase
    return (S.lower() == S)

root = tk.Tk()

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

注: コマンドを登録するポイントは、基礎となる tcl/tk エンジンと python ライブラリ間のブリッジを作成することです。本質的には、関数を呼び出す tcl コマンドを作成しOnValidate、提供された引数を与えます。これが必要なのは、tkinter が tk の入力検証機能への適切なインターフェースを提供できなかったためです。%dファンシー変数 ( 、%iなど)のすべてが必要ない場合は、この手順を実行する必要はありません。

エラーNameError: name 'entry' is not definedは、entry何であるかを定義する前に使用しているためですentry。クラスを使用する利点の 1 つは、メソッドを使用する場所よりもファイル内のさらに下にメソッドを定義できることです。手続き型スタイルを使用すると、関数を使用する前に関数を定義する必要があります*。

* 技術的に言えば、関数を使用する前に常に関数を定義する必要があります。クラスを使用する場合、クラスのインスタンスを作成するまで、クラスのメソッドを実際に使用することはありません。インスタンスは、ファイルの終わり近くまで実際には作成されないため、使用する前にコードを十分に定義できます。

于 2014-01-04T16:52:22.597 に答える