2

私はたくさんのボタン (100 以上) を持つプログラムを書いています。それぞれに固有の結果が必要ですが、すべての結果は似ています。これは最初のボタンのコードです。

box1= 'filepath to text file'
def openfile(filename):
    filetxt = (open(filename,"r").read())
    return filetxt
    var.set(filetxt)

def Box1():
    var.set(openfile(box1))

openfile(box1)
window1 = Tk()
window1.geometry('450x450')

var = StringVar()

Button1 = Button(donut,text = "Box #1", command= Box1 )
Button1.pack()

各ボタンは同じことを行いますが、異なるファイルにアクセスします。ボタンごとに一意のコールバック関数を単純に記述するよりも効率的な方法はありますか?

4

2 に答える 2

2

すべてのボタンで 1 つのコールバックを共有できます。ラムダを使用して、ファイル名をコールバックに渡すことができます。例えば:

path="/path/to/the/file"
b = Button(..., command=lambda f=path: openfile(f))

別のオプションは、functools.partialを使用することです。これはラムダよりも読みやすいと考える人もいます:

b = Button(..., command=functools.partial(openfile, path))
于 2012-10-18T18:29:09.933 に答える
2

通常、リストにファイルがあります。

list_of_files = ...

次に、ファイル入力を開くボタンを作成する関数を作成します。

def file_open_button(filename):
    b = Button(donut, text = 'open {0}'.format(filename), command = lambda: openfile(filename))
    return b

次に、ファイルのリストを繰り返し処理し、ボタンを作成して、パックします。

for f in list_of_files:
    button = file_open_button(f)
    button.pack()

おそらく、あなたが見逃しているのは、lambda(匿名) 関数の理解です。ラムダ関数は通常の関数によく似ています:

def foo(x):
    return x*x

bar = lambda x: x*x

上記のステートメントは非常に似ています。たとえばfoo(x) == bar(x)、常になりますTrue

于 2012-10-18T18:27:46.593 に答える