我试图让这个程序将 .csv
文件的内容打印到 GUI
上。
我在 Tkinter
中创建。它主要工作,但我想不出一种方法让每个按钮打印它链接到的文件的内容。
目前,我创建了一个仅链接到其中一个文件的变量,这表明它可以正常工作。
变量是“loadFiles”,设置打开的项目是“a_P.csv”。有什么方法可以使按钮将此变量链接到相关的 .csv 文件?
代码在此 pastebin 链接中: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)
最后我更改了加载函数以接受一个参数:
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/
关于python - 如何使用 Python Tkinter 使按钮打开特定的 .csv 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754056/