Вернуть значение из замыкания и использовать его в другом модуле - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь получить значение из замыкания в другом модуле.Когда я нажимаю кнопку в графическом интерфейсе, диалоговое окно файла создает строку с путем к файлу (так что этот шаг работает).Строка должна быть доступна в 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()

Что мне нужно изменить, чтобы «напечатать» строку с именем файла из функции choose_file1 (определенной внутри функции gui) в файле main.py?

1 Ответ

0 голосов
/ 30 мая 2018

С вашим кодом есть две основные проблемы:

  • Функция gui не имеет явного возвращаемого значения.Поэтому, когда вы вызываете его, он возвращает None

  • Значение, возвращаемое returnfile1 (которое получается из choose_file1), не сохраняется в переменной, поэтому теряется прифункция завершается.

Вот быстрое исправление, чтобы заставить ваш код работать (никаких изменений в "main.py" не требуется):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...