如何将函数结果调用到另一个函数的tkinter窗口列表框中?

时间:2019-04-17 12:18:59

标签: python tkinter

有人可以帮助我完成此代码吗?在这种情况下,我试图将函数的结果传递给tkinter框架中的父函数,这是一个称为“ processFile”的嵌套函数。我只是最近才开始使用类,所以我还有很多东西要学习,而且我敢肯定,您可以立即指出,到目前为止我所做的并不是最佳实践或有效的方法。

我试图使processFile在该类中成为一个常规函数,并在下面的代码中看到一个嵌套函数。我遇到的大多数错误是

第24行,在     button1 = Button(ouUpdate,text ='Open File',command = lambda:processFile(self,filename)) NameError:未定义名称“文件名”

我理解为什么,并且我意识到使用列表框必须首先将结果字符串转换为列表,但是在实现此功能方面需要帮助。

注意:我最终将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 个答案:

答案 0 :(得分:1)

您不需要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