2012-03-17 431 views
2

我試圖讓該程序將.csv文件的內容打印到GUI上。如何使用Python Tkinter打開特定的.csv文件按鈕?

我已在Tkinter中創建。它主要工作,但我不能找出一種方法來讓每個按鈕來打印它鏈接到的文件的內容。

目前我創建了一個鏈接到其中一個文件的變量,這表明它的工作原理。

變量是「loadFiles」,它打開的項目是「a_P.csv」。有什麼辦法可以讓按鈕將這個變量鏈接到相關的.csv文件?

的代碼是在這個引擎收錄link: http://pastebin.com/ZP2pPvKA

程序搜索在同一文件夾它"_P.csv"結尾的文件,所以你可能需要創建一個.csv與它7個對象。

回答

1

我也試過這個起初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)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) 

我不確定這會是最好的做法,但都行。

(當然,拉姆達的做法確實有點顯得更「Python化」)

來源:https://code.activestate.com/recipes/66521-avoiding-lambda-in-writing-callback-functions/

+0

謝謝,我知道了現在的工作。我去了第二個,因爲它對我來說似乎更容易理解。 – Launch 2012-03-18 21:33:47

1

您可以使用lambda函數將參數傳遞給您的加載函數。不幸的是,pastebin ist現在,所以我不能看看你的代碼。我們的想法是這樣的:

爲文件名的文件名: ...按鈕(...,命令=拉姆達I =文件名:使用loadFile(1),......

所以在你的loadFile功能你有文件名作爲第一個參數