Как заставить кнопку открыть определенный файл .csv с помощью Python Tkinter? - PullRequest
2 голосов
/ 18 марта 2012

Я пытаюсь заставить эту программу печатать содержимое файла .csv на GUI.

Я создал в Tkinter. В основном это работает, но я не могу найти способ заставить каждую кнопку напечатать содержимое файла, с которым она связана.

На данный момент я создал переменную, которая ссылается только на один из файлов, который показывает, что он работает.

Переменная «loadFiles» , и проект, который она должна открыть, - «a_P.csv». Можно ли как-нибудь заставить кнопки связать эту переменную с соответствующим файлом .csv?

Код находится в этой папке link: http://pastebin.com/ZP2pPvKA

Программа ищет файлы, заканчивающиеся на "_P.csv" в той же папке, что и ее, поэтому вам, возможно, придется создать .csv с 7 объектами в нем.

Ответы [ 2 ]

1 голос
/ 18 марта 2012

Я тоже попробовал так, как сначала предложил Хайнцдераугст:

 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)

Я не уверен, что будет лучшей практикой, но оба работают.

(Конечно, лямбда-подход кажется более «питонным»)

Источник: https://code.activestate.com/recipes/66521-avoiding-lambda-in-writing-callback-functions/

1 голос
/ 18 марта 2012

вы можете использовать лямбда-функцию для передачи аргумента в вашу функцию загрузки. К сожалению, pastebin сейчас недоступен, поэтому я не могу взглянуть на ваш код. Идея примерно такая:

для имени файла в именах файлов: ... Кнопка (..., команда = лямбда i = имя файла: loadFile (i), ...

так что в вашей функции loadFile у вас есть имя файла в качестве первого параметра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...