2012-03-17 394 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功能你有文件名作为第一个参数