有人可以帮助我完成此代码吗?在这种情况下,我试图将函数的结果传递给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()
答案 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