2017-04-19 6 views
0

私は、Truthy/Falsy値を持っているかどうかチェックしたいtkinterエントリと対応するStringVarのdictを持っています。ちょうどビルトインを使用して、よりクリーンでニシキヘビ方法はありall(dict.values())を通して関数を適用できますか?

>>> from tkinter import * 
>>> root=Tk() 
>>> row={'new':{}, 'old':{}} 
>>> row['new']['data']=StringVar(value='something') 
>>> row['new']['non_data']=StringVar(value='') 
>>> 
>>> def my_all(StringVarIter): 
... for element in StringVarIter: 
...  if not element.get(): 
...  return False 
... return True 
... 
>>> my_all(row['new'].values()) 
False 
>>> row['new']['non_data']=StringVar(value='something else') 
>>> my_all(row['new'].values()) 
True 

と:私は、値にアクセスするために)STRINGVARを反復処理とに.getを(使用できること)(私はオフにすべての私の独自のバージョンを書くことができます知っていますtkinter関数ですか?あなたが実際にmap(StringVar.get(), row['new'].values())と本当に近かった

+1

mapの最初の引数は、各値を単一の引数としてとる関数である必要があります。 'map(lambda sv:sv.get()、row ['new']。values())' – jonrsharpe

+0

ありがとう@jonrsharpeが動作します。それを答えてください、私はそれを受け入れるでしょう。 – Pepi

答えて

0

)私は

>>> map(StringVar.get(),row['new'].values()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: get() missing 1 required positional argument: 'self' 

も(反復可能な機能、)フィルタを試して、これらの線に沿って考えていた。しかしそれにも(私のすべてのために必要な反復可能を得ることはありません。このエラーは、インスタンスを提供せずにクラスのメソッドを呼び出すためです。 mapへの最初の引数は、反復可能な第2引数の各項目を1つのパラメータとして順番に受け取る呼び出し可能でなければなりません。

ですから、実際にはむしろそれを呼び出そうとするよりも、メソッドを参照し、順番に渡されたインスタンスを取得することができます:あなたは、多くの場合に使用lambda Sを参照してください(

map(StringVar.get, row['new'].values()) 
       #^note no parentheses, we're not calling the method 

したり、独自の単一引数は呼び出し可能にするにthis):

map(lambda sv: sv.get(), row['new'].values()) 
        #^this time we're calling it inside the lambda 
関連する問題