Spyder 3.7 - Как сохранить значение в переменной из функции - PullRequest
0 голосов
/ 14 марта 2020

Я понимаю, что это, вероятно, действительно просто, я делаю это в Matlab все время. Прямо сейчас все, что я хочу сделать, это использовать кнопку в tkinter, чтобы открыть диалоговое окно файла, выбрать файл и сохранить путь в переменной.

class Functions:
    def FileDialog(Pathname):
        Pathname = tkFileDialog.askopenfilename()

Funks = Functions()
Btn1 = tkinter.Button(MainWindow, text = "Browse", command = Funks.FileDialog)

После выполнения функции "Pathname" go? Как я могу просмотреть его в проводнике переменных?

Обновление: код теперь структурирован по-другому, и вот он полностью

##########################################
import tkinter as tk                     #
from tkinter import Frame                #
import tkinter.filedialog as tkFileDialog#
##########################################

class Window(Frame):
    def __init__(self, master = None):
        Frame.__init__(self, master)
        self.master = master
        self.MainWindow()

    def MainWindow(self):
        self.master.title("The SHIFT Show"); self.pack() 
        Btn1 = tk.Button(self, text = "Browse", command = self.FileDialog)
        Btn1.place(x = 0, y = 0); Btn1.pack()
        Btn2 = tk.Button(self, text = "Close Window", command = self.Exit) 
        Btn2.place(x = 0, y = 0); Btn2.pack()
        Btn3 = tk.Button(self, text = "Pathname?", command = self.PathTest)
        Btn3.place(x = 0, y = 0); Btn3.pack()

    def FileDialog(self):
        Pathname = tkFileDialog.askopenfilename()
        return Pathname

    def Exit(self):
        exit() #DOESNT WORK

    def PathTest(self,Pathname):
        print(Pathname)

root = tk.Tk()
app = Window(root)
root.geometry("500x500+2500+1100")
root.mainloop()

Ответы [ 3 ]

1 голос
/ 16 марта 2020

Ваш класс Functions не работает должным образом, потому что вы не настроили его методы для работы в качестве методов. Обычный метод должен ожидать, что экземпляр класса будет передан в качестве первого аргумента (по соглашению этот аргумент называется self, хотя это не обязательно).

После того, как у вас есть self В качестве аргумента вы можете создать атрибуты для хранения данных, которые передаются в ваши методы. Это, вероятно, то, что вы ищете здесь.

Попробуйте это:

class Functions:
    def file_dialog(self):
        self.pathname = tkFileDialog.askopenfilename()

Теперь, если вы создаете экземпляр с именем funks и передаете funks.file_dialog в качестве обратного вызова для вашей кнопки , он сохранит имя файла, выбранное пользователем, как funks.pathname. Обратите внимание, что я переименовал несколько имен ваших функций и переменных, чтобы они лучше отображались в Python типичном стиле, где CapitalizedNames используются только для классов, а большинству других переменных (и функций) присваивается lower_case_names_with_underscores.

Обратите внимание, что вы, возможно, захотите структурировать свой код по-другому и не называть свой класс Functions, поскольку цель класса в действительности должна состоять в том, чтобы связать кучу data вместе (с помощью связанных методов). Классы обычно не просто используются в качестве пространства имен для помещения несвязанных функций. Если вам просто нужно пространство имен, то очевидным выбором является модуль. Я думаю, что класс действительно имеет смысл в ситуации, о которой вы здесь спрашиваете, но вы должны назвать класс с учетом его данных! Если вы имеете дело с несвязанными данными в разных частях кода, это говорит о том, что вам, вероятно, нужны разные классы для этих частей.

0 голосов
/ 17 марта 2020

Я получил это, чтобы сделать то, что я хотел. уау.

##########################################
import tkinter as tk                     #
from tkinter import Frame                #
import tkinter.filedialog as tkFileDialog#
##########################################

class Window(Frame):
    def __init__(self, master = None):
        Frame.__init__(self, master)
        self.master = master
        self.MainWindow()

    def MainWindow(self):
        self.master.title("The SHIFT Show"); self.pack() 
        # BUTTONS
        ## File dialog button
        Btn1 = tk.Button(self, text = "Browse", command = self.FileDialog)
        Btn1.place(x = 0, y = 0); Btn1.pack()
        ## Close window button
        Btn2 = tk.Button(self, text = "Close Window", command = self.Exit) 
        Btn2.place(x = 0, y = 0); Btn2.pack()
        ## Test button for....things
        Btn3 = tk.Button(self, text = "Pathname?", command = self.PathTest)
        Btn3.place(x = 0, y = 0); Btn3.pack()

    def FileDialog(self):
        global Pathname
        folderpath = tkFileDialog.askdirectory()
        Pathname = folderpath        

    def Exit(self):
        exit() # STILL DOESNT WORK

    def PathTest(self):
        print(Pathname) # Outputs the folder path to the console (so I know it's there)

root = tk.Tk()
app = Window(root)
root.geometry("500x500+2500+1100")
root.mainloop()
0 голосов
/ 14 марта 2020

В общем, нет. Pathname является локальной переменной. По определению, он не существует после выхода из функции. Пространство вызовов выталкивается из стека времени выполнения, память освобождается и восстанавливается, и эта информация больше не доступна.

Если вы хотите работать с этим значением вообще, вам нужно как-то перенести его за пределы этой функции. Типичные методы включают в себя:

  • распечатать его (полезно для людей; не для остальной части вашего кода)
  • return это в конце функции
  • передать изменяемый аргумент; сохранить путь к файлу в соответствующем параметре

. Для этого последнего параметра потребуется изменить сигнатуру (профиль вызова) на FileDialog и указать ему sh второй аргумент.

...