Python 从闭包返回值并在其他模块中使用
我试图从另一个模块中的闭包中获取一个值。当我按下GUI中的按钮时,“文件”对话框将创建一个带有文件路径的字符串(因此此步骤有效)。然后,应该可以在Python 从闭包返回值并在其他模块中使用,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我试图从另一个模块中的闭包中获取一个值。当我按下GUI中的按钮时,“文件”对话框将创建一个带有文件路径的字符串(因此此步骤有效)。然后,应该可以在main.py中访问该字符串。此步骤不起作用,在main中总是None 这是我在文件main.py中的内容: import mat_import import GUI filename1 = GUI.gui() print(filename1) 这就是我在GUI.py中的内容 from tkinter import * from tkinter
main.py
中访问该字符串。此步骤不起作用,在main
中总是None
这是我在文件main.py
中的内容:
import mat_import
import GUI
filename1 = GUI.gui()
print(filename1)
这就是我在GUI.py中的内容
from tkinter import *
from tkinter import filedialog
from PIL import ImageTk, Image
import os
import math
import sys
def gui():
mainpage = Tk()
def choose_file1():
filename1 = filedialog.askopenfilename()
lbl_read_file1_path = Label()
lbl_read_file1_path.configure(text = filename1)
lbl_read_file1_path.grid(column=1, row=5, sticky="W", columnspan=3)
return filename1
def returnfile1():
return choose_file1()
button_read_file1 = Button(mainpage, text="Durchsuchen...", command = returnfile1)
button_read_file1.config(height = 1, width = 15)
button_read_file1.grid(column=0, row=5, sticky="W")
mainloop()
我必须更改什么才能“打印”文件名为的字符串,从函数
选择文件main.py中的\u file1
(在函数gui
中定义)?您的代码有两个主要问题:
- 函数
gui
没有显式返回值。因此,当您调用它时,它返回None
returnfile1
(从choose\u file1
获取)返回的值未存储在变量中,因此在函数退出时丢失
下面是让代码正常工作的快速修复方法(“main.py”中不需要任何更改):
gui()
函数没有任何return
语句,因此其返回值总是None
。在调用mainloop()
之后,您可能应该返回一些内容。据我所知,您的GUI.GUI()
函数不返回任何值。@是的,但当我返回“filename1”时,它表示filename1未在中定义gui@Rainerreturnfile1的输出存储在哪里?我想不是。此外,filename1
是choose\u file1
的一个局部变量,gui
对此一无所知。这是问题的一部分。这也是正确的:filename1
是choose\u file1
的本地变量。如果您想从gui()
访问它,您可以在gui()
中声明它,然后在中使用非本地
,选择\u file1()
(请参阅)。如果您计划使用Python和tkinter开发更高级的gui,您可能想阅读有关面向对象编程的内容。如果您描述所做的更改,这个答案会更好。否则,我们必须逐行阅读代码,并将其与原始代码进行比较,以了解您的不同之处。@BryanOakley现在更好了吗?是的,更好了。
from tkinter import *
from tkinter import filedialog
from PIL import ImageTk, Image
import os
import math
import sys
def gui():
mainpage = Tk()
# Variable to store the filename
filename1 = ""
def choose_file1():
# We want to use the same variable filename1 we declared above
nonlocal filename1
filename1 = filedialog.askopenfilename()
lbl_read_file1_path = Label()
lbl_read_file1_path.configure(text = filename1)
lbl_read_file1_path.grid(column=1, row=5, sticky="W", columnspan=3)
# No return statement is needed here
# Function 'returnfile1' is not needed.
button_read_file1 = Button(mainpage, text="Durchsuchen...", command = choose_file1)
button_read_file1.config(height = 1, width = 15)
button_read_file1.grid(column=0, row=5, sticky="W")
mainloop()
# Return the value of filename1
return filename1