Как вызвать результаты функции в окно списка tkinter, которое находится в другой функции? - PullRequest
0 голосов
/ 17 апреля 2019

Может кто-нибудь помочь мне завершить этот код? Я пытаюсь передать результаты функции, в данном случае это вложенная функция с именем "processFile", в родительскую функцию в кадре tkinter. Я только недавно начал использовать классы, так что мне еще есть чему поучиться, и я уверен, что вы неизбежно отметите, что то, что я сделал до сих пор, не является лучшей практикой или эффективностью.

Я попытался сделать processFile обычной функцией в классе и вложенной функцией, как показано в коде ниже. Большинство ошибок, которые я получаю,

строка 24, в button1 = Button (ouUpdate, text = 'Открыть файл', команда = lambda: processFile (self, filename)) NameError: имя 'filename' не определено

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

ПРИМЕЧАНИЕ. В конечном итоге я напишу программу чтения csv в функцию processFile, чтобы прочитать результаты csv в список, но сейчас я просто пытаюсь начать.

from tkinter import *
from tkinter import filedialog
from tkinter.filedialog import askopenfilename

class GUI:
    def mainPage(self):
        home = Frame(root)
        home.place(relwidth=1, relheigh=1)
        label = Label(home, text='Cyber Database Console', bg='#ccffcc', font=('Arial', 18))
        label.place(relx=0 , rely=0, relheigh=0.1, relwidth=1)
        button1 = Button(home, text='OU Update', command=lambda: self.ouUpdate())
        button1.place(relx=0.1, rely=0.2, relheigh=0.05, relwidth=0.2)
        button2 = Button(home, text='VID Update', command=lambda: self.vIDUpdate())
        button2.place(relx=0.1, rely=0.3, relheigh=0.05, relwidth=0.2)


    def ouUpdate(self):
        ouUpdate = Frame(root)
        ouUpdate.place(relwidth=1, relheigh=1)
        label = Label(ouUpdate, text='Database OU Update Console', bg='#ccffcc', font=('Arial', 18))
        label.place(relx=0 , rely=0, relheigh=0.1, relwidth=1)
        button1 = Button(ouUpdate, text='Back', command=lambda: self.mainPage())
        button1.place(relx=0, rely=0.1, relheigh=0.05, relwidth=0.2)
        button1 = Button(ouUpdate, text='Open File', command=lambda: processFile(self, filename))
        button1.place(relx=0, rely=0.4, relheigh=0.05, relwidth=0.2)
        listing = Listbox(ouUpdate)
        listing.place(relx=0.1, rely=0.6, relheigh=0.1, relwidth=0.5)

        def processFile(self, filename):
            filename = askopenfilename()
            return filename

    def vIDUpdate(self):
        vIDUpdate = Frame(root)
        vIDUpdate.place(relwidth=1, relheigh=1)
        label = Label(vIDUpdate, text='Database V-ID Console', bg='#ccffcc', font=('Arial', 18))
        label.place(relx=0 , rely=0, relheigh=0.1, relwidth=1)
        button1 = Button(vIDUpdate, text='Back', command=lambda: self.mainPage())
        button1.place(relx=0, rely=0.1, relheigh=0.05, relwidth=0.2)


root = Tk()
canvas = Canvas(root, heigh=500, width=600)
canvas.pack()

begin = GUI()

begin.mainPage()

root.mainloop()

1 Ответ

1 голос
/ 17 апреля 2019

Вам не нужно filename в processFile(self, filename):, чтобы получить значение из функции.

 def processFile(self):
     return askopenfilename()

 ... command=lambda:processFile(self)

Это понадобится вам, только если вы хотите отправить имя файла для работы.

Но Button не может получить этот результат и присвоить переменную, поэтому лучше сделать это внутри функции

 def processFile(self):
     self.filename = askopenfilename()

и затем вы можете использовать эту переменную в других методах класса.

Но вы не можете сделать это, чтобы вернуться к ouUpdate, потому что эта функция выполняется и завершается при запуске - даже прежде, чем вы увидите окно. Вы должны использовать имя файла непосредственно в этой функции

 def processFile(self):
     self.filename = askopenfilename()
     data = open(self.filename).read()
     # ... process data ...

Вместо command=lambda: self.mainPage() вы можете сделать command=self.mainPage
(без lambda и ())

То же самое с другими

command=lambda: self.ouUpdate() -> command=self.ouUpdate

command=lambda: self.vIDUpdate() -> command=self.vIDUpdate

Если вы поместите processFile(self) как обычный метод в классе, а не вложенный, то вы также можете использовать command=self.processFile

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