Я до сих пор довольно новичок в Python и программировании в целом, но, как метод изучения еще нескольких Python и просто возиться с некоторыми реестрами Windows, я начал работать с очень простым экстрактором данных tkinter и Python3.
Я застрял, получая выход из функции, чтобы хранить как переменную каким-то образом, чтобы использовать ее позже, а иногда и многократно. Существует несколько кнопок для поиска путей, сохранения пути к файлу, и я хочу использовать этот путь к файлу в другой функции для захвата данных из файлов.
def sw_click():
sw_path1 = tkinter.filedialog.askopenfilename(initialdir='C:/Users/%s')
swP_label.config(text=swpath1)
return sw_path1
Затем мне хотелось использовать данные Return (sw_path1), который является только локальным системным путем, в другую функцию, которая будет вызываться позже. Например:
def swpull_click():
swinfo = *function_pullkey (sw_path1) #Using another function
Return sw_data # again as a variable for later use
Все функции работают отдельно, но получение возврата одного в другое для использования позже было препятствием. Я попытался сохранить это, используя другую переменную, например
Var1 = sw_path1
Но это становится нерешенной ссылкой вне самой функции
Любая помощь будет принята с благодарностью. Спасибо
**** Обновление Добавление переменной вне функции, например:
sw_path1 = None
def software_click():
global sw_path1
tkinter.filedialog.askopenfilename(initialdir='')
softwareP_label.config(text=sw_path1)
return sw_path1
Не сохраняет переменную, как только она будет получена, она всегда отсутствует.
Установка переменной в None перед выполнением функции позволяет ее вызвать в функцию с использованием глобальной настройки. Используя глобальную функцию, до тех пор, пока эта переменная обновляется внутри функции, эта глобальная переменная, ранее установленная в None, будет обновлена. Затем он сохраняется для последующего использования, если другая функция или процесс не очистит или не заменит его.
import tkinter
from tkinter import filedialog
root = tkinter.Tk()
# Setting a variable to none, that can be used, updated, etc.
var1 = None
# So here a user would select their file, which would update var 1 from None, to the results
# This can be handy for validations using if statements to show the variable has not been updated
def function_1():
global var1 # Must be set to global in the function to be able to access var1 and update
print(var1)
var1 = tkinter.filedialog.askopenfilename(initialdir='C:')
print(var1)
# Updating the variable in the manner above allows for it to be updated repeatedly
# Now that updated variable can be used in function2
def function_2():
print(var1)
button1 = tkinter.Button(root, text="get the path", command=function_1)
button2 = tkinter.Button(root, text="do something with it", command=function_2)
button1.pack()
button2.pack()
root.mainloop()
Три функции печати, используемые (2 в функции 1 и 1 в функции2), будут возвращаться в следующем порядке:
None
C:/Windows/regedit.exe
C:/Windows/regedit.exe
Удаление пресета Var1 = None
приводит к запуску скрипта, но при вызове функции 1 будет существовать NameError, NameError: name 'var1' is not defined
Удаление global var1
из global var1
, при этом var1 все еще установлен вне None, сценарий все равно будет выполняться, но при использовании функции 1 он выкинет UnboundLocalError: local variable 'var1' referenced before assignment
ошибки UnboundLocalError: local variable 'var1' referenced before assignment
в первой строке переменная видна в функциях,
определить переменную на уровне модуля. если он установлен в функциях w_click, значение все равно можно использовать в функции swpull_click.
sw_path1 = None
def sw_click():
# the global keyword stats that a module level variable can be set inside a function
global sw_path1
sw_path1 = tkinter.filedialog.askopenfilename(initialdir='C:/Users/%s')
swP_label.config(text=swpath1)
return sw_path1
def swpull_click():
swinfo = *function_pullkey (sw_path1) #Using another function
return sw_data # again as a variable
Вам нужно сделать переменную sw_data глобальной переменной. В настоящее время это переменная уровня функции. Для этого объявите переменную вне функции.
Затем вы можете вызвать sw_path1 в любой другой функции
Надеюсь это поможет!
pickle
чтобы сохранить состояние переменной, перезагрузив ее при следующем запуске программы.path = sw_click()
чтобы позже вы могли использоватьprint(path)
например?