Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从闭包返回值并在其他模块中使用_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 从闭包返回值并在其他模块中使用

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

我试图从另一个模块中的闭包中获取一个值。当我按下GUI中的按钮时,“文件”对话框将创建一个带有文件路径的字符串(因此此步骤有效)。然后,应该可以在
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@Rainer
returnfile1的输出存储在哪里?我想不是。此外,
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