python - Python Tkinterを使用してボタンに特定の.csvファイルを開く方法は?

原文 python user-interface csv tkinter

このプログラムで.csvファイルの内容をGUIに印刷しようとしています。

Tkinterで作成しました。ほとんど機能しますが、リンク先のファイルの内容を印刷するために各ボタンを取得する方法がわかりません。

現時点では、ファイルの1つだけにリンクする変数を作成しました。これは、それが機能することを示しています。

変数は「loadFiles」で、開くように設定されているプロジェクトは「a_P.csv」です。ボタンにこの変数を関連する.csvファイルにリンクさせる方法はありますか?

コードはこのペーストビンにありますlink: http://pastebin.com/ZP2pPvKA

プログラムは、同じフォルダーで"_P.csv"で終わるファイルを検索するため、7つのオブジェクトを含む.csvを作成する必要がある場合があります。
答え
heinzderaugustが最初に提案した方法でもこれを試しました:

 button[i] = ttk.Button(loadProject, text=data_files[i], command = lambda i=data_files[i]:load(i)).grid(column=1, row=i, sticky=W)  


また、コールバックの中間部分としてクラスを使用することで、これを解決することもできました。
(このクラスはviewProject内に挿入されました)

class Command:
            def __init__(self, callback, *args, **kwargs):
                    self.callback = callback
                    self.args = args
                    self.kwargs = kwargs

            def __call__(self):
                    return(self.callback(*self.args, **self.kwargs))


次に、ボタンの定義を次のように変更しました。

button[i] = ttk.Button(loadProject, text=data_files[i], command = Command(load,data_files[i])).grid(column=1, row=i, sticky=W)     


最後に、引数を受け入れるようにload関数を変更しました。

def load(myFile):                
            spamReader = csv.reader(open(myFile))
            for row in spamReader:
                    a = list(row)

            ttk.Label(loadProject, text=(a[0])).grid(column=4, row=0, sticky=W)
            ttk.Label(loadProject, text=("\n"+a[1])).grid(column=4, row=1, sticky=W)
            ttk.Label(loadProject, text=("\n"+a[2])).grid(column=4, row=2, sticky=W)
            ttk.Label(loadProject, text=(a[3])).grid(column=4, row=3, sticky=W)
            ttk.Label(loadProject, text=(a[4])).grid(column=4, row=4, sticky=W)
            ttk.Label(loadProject, text=("\n"+a[5])).grid(column=4, row=5, sticky=W)
            ttk.Label(loadProject, text=("\n"+a[6])).grid(column=4, row=6, sticky=W)
            ttk.Label(loadProject, text=("\n\n"+a[7])).grid(column=4, row=7, sticky=W)


どちらがベストプラクティスになるかはわかりませんが、どちらも機能します。
(確かに、ラムダアプローチは一種の「パイソン」のように見えます)
出典:https://code.activestate.com/recipes/66521-avoiding-lambda-in-writing-callback-functions/
関連記事

python - Django:多対多をフォームに保存する

if-statement - チェックとポーリングのメカニズムのPython的な方法

python - このWhileステートメントの最後のインクリメンターが起動しないのはなぜですか

python - Numpy配列の割り当て

python - WAFを使用したQTプロジェクトの構築

c++ - qextserialportはWindowsでデータをドロップします—それに対して何ができますか?

python - PyQt4:QListWidget間でアイテムを移動する

.net - XMLファイルの重複する値を削除して最後の値を保持する方法

python - Django:不要なSQLステートメントを回避するにはどうすればよいですか?

python - Mechanize(Python)を使用してリダイレクトログを取得する