2012-03-17 14 views
2

私は.csvファイルの内容をGUIに印刷するためにこのプログラムを取得しようとしています。Python Tkinterを使用してボタンに特定の.csvファイルを開く方法を教えてください。

Tkinterで作成しました。主に動作しますが、リンクされているファイルの内容を各ボタンに表示させる方法はありません。

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

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

コードは、このペーストビンそれと同じフォルダに"_P.csv"で終わるファイルについてlink: http://pastebin.com/ZP2pPvKA

プログラムの検索をしているので、あなたはそれで7つのオブジェクトと.CSVを作成する必要があります。

答えて

1

最初のパラメータとしてファイル名を持っている (このクラスはインviewProject内)erted

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)  

そして最後に、私は引数を受け入れるようにロード機能を変更:

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/

+0

おかげで、私はそれが今取り組んで持っています。私は2番目のものと一緒に行きました。なぜなら、私にとって理解しやすいように思えるからです。 – Launch

1

ラムダ関数を使用して、引数をロード関数に渡すことができます。残念ながら、現在のところpastebin istがダウンしているので、コードを見ることはできません。あなたのロードファイル機能でそうloadFileは(I)、...

:ファイル名にファイル名の

: ...]ボタン(...、コマンド=ラムダI =ファイル名のアイデアは、このようなものです

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

は、私はまた、コールバックの仲介一部としてクラスを使用することによってこの問題を解決することができた:あなたは、私もheinzderaugust最初に提案され、この方法を試してみました

関連する問題