Как получить переменные из функции в другую функцию?
Я пытаюсь создать простой Tkinter
приложение регистрации пользователя и столкнулись с проблемой. Я хочу получить информацию от Entry
в другую функцию.
Мой код на данный момент:
from Tkinter import *
def addUsr():
username = sv.get() #here
password = sv1.get() #here
page = open("Users.txt", 'r+')
contents = page.read()
page.write("--->")
page.write("\n")
page.write("username: " + username)
page.write("\n")
page.write("password: " + password)
page.write("\n")
page.write("<---")
page.write("\n")
page.close()
print contents
def reg():
usrs = Tk()
usrs.title("Text")
usrs.geometry('450x300+200+200')
sv = StringVar()
sv1 = StringVar()
ent1 = Entry(usrs, textvariable=sv).pack()
ent2 = Entry(uses, textvariable=sv1).pack
button1 = Button(usrs, text="submit", command=addUsr).pack(side='bottom', padx=15, pady=15)
usrs.mainloop()
Я хочу получить sv
а также sv1
в addUsr
функция, но этот код возвращает сообщение об ошибке:
username = sv.get()
NameError: global name 'sv' is not defined
Когда код построен так, что вторая функция не является функцией, этот код работает. Я просто хочу найти способ получить тот же результат, но с использованием этой структуры. Как вы думаете, я это делаю?
1 ответ
Я думаю, что это структурная проблема. Обычно вы используете класс для создания приложения и помещаете все под этот класс. Тогда доступ к функциям и переменным из любого места прост. Я создал простой пример, потому что у меня нет времени переписать весь ваш код!
from Tkinter import *
class Application(Frame): # create a class to hold the application within
def __init__(self, master): # boot it up
""" Initialize the frame. """
Frame.__init__(self, master)
self.grid()
self.create_widgets()
self.var1 = "var1"
self.var2 = "var2"
def create_widgets(self): # create the GUI interface
self.lbl = Label(self, text = "xxxx")
self.lbl.grid(row = 0, column = 0, columnspan = 2, sticky = W, pady = 4)
self.input = Text(self, width = 35, height = 5, wrap = WORD)
self.input.grid(row = 1, column = 0, columnspan = 2, sticky = W)
self.submit_button = Button(self, text = "submit", command = self.functionX)
self.submit_button.grid(row = 2, column = 0, columnspan = 2, sticky = W)
def functionX(self):
print "do some stuff"
self.var3 = "yet another variable" # create a variable in one function for access in another
self.functionY() # call one function from another function
def functionY(self):
print "do something else"
print self.var1 # access some class variables
print self.var2
print self.var3
root = Tk()
root.title("xxxxxxxxxxxx")
root.geometry("330x310")
app = Application(root)
Надеюсь, это поможет, это довольно понятно, когда вы запускаете код и читаете его, чтобы понять, что происходит. (кстати, в итоге я использовал PyQt/Pyside с QtDesigner вместо Tkinter, вы можете проверить это, если уже не знаете об этом).