如何使用Python Tkinter使按钮打开特定的.csv文件?

时间:2012-03-17 21:48:26

标签: python user-interface csv tkinter

我正在尝试让此程序将.csv文件的内容打印到GUI上。

我在Tkinter创建了。它主要起作用,但我无法找到一种方法让每个按钮打印它链接到的文件的内容。

目前我已经创建了一个链接到其中一个文件的变量,这表明它可以正常工作。

变量是“loadFiles”,它设置为打开的项目是“a_P.csv”。有什么方法可以让按钮将此变量链接到相关的.csv文件?

代码位于此pastebin link: http://pastebin.com/ZP2pPvKA

程序在同一文件夹中搜索以"_P.csv"结尾的文件,因此您可能需要创建一个包含7个对象的.csv。

2 个答案:

答案 0 :(得分:1)

您可以使用lambda函数将参数传递给加载函数。不幸的是,pastebin现在已经关闭,所以我无法查看您的代码。这个想法是这样的:

表示文件名中的文件名:     ...按钮(...,command = lambda i = filename:loadFile(i),...

所以在你的loadFile函数中你有文件名作为第一个参数

答案 1 :(得分: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内)

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)

我不确定哪种方法最佳,但两者都有效。

(当然,lambda方法看起来更像'pythonic')

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