Использовать переменную вне вложенной функции

#python #function #variables #tkinter

#python #функция #переменные #tkinter

Вопрос:

Мой код использует поле ввода tkinter внутри функции для получения IP-адреса от пользователя. При нажатии кнопки переменной присваивается ip-адрес (server_ip). Эта переменная используется позже в коде для настройки соединения с сокетом. Моя проблема в том, что я не могу использовать переменную вне основной функции.

 import tkinter as tk

def get_server_ip():
    def retrieve_server_ip():
        server_ip = ent_ip.get()
        home.destroy()
        return server_ip

    home = tk.Tk()
    home.title("Enter Server Ip Address")
    home.geometry('100x75')

    lbl_ip = tk.Label(home, text="Enter Server IP")
    lbl_ip.pack()
    ent_ip = tk.Entry(home)
    ent_ip.pack()
    btn_enter = tk.Button(home, text="Enter", command=retrieve_server_ip)
    btn_enter.pack()

    tk.mainloop()
    
get_server_ip()
print (server_ip)
  

Ответ №1:

Объявите, что переменная является глобальной, прежде чем использовать ее, вот так:

 def get_server_ip():
    def retrieve_server_ip():
        global server_ip
        server_ip = ent_ip.get()
        home.destroy()
        return server_ip
  

Ответ №2:

Вместо этого вы можете вернуть значение из функции:

 import tkinter as tk

def get_server_ip():
    server_ip = None
    def retrieve_server_ip():
        nonlocal server_ip
        server_ip = ent_ip.get()
        home.destroy()

    home = tk.Tk()
    home.title("Enter Server Ip Address")
    home.geometry('100x75')

    lbl_ip = tk.Label(home, text="Enter Server IP")
    lbl_ip.pack()
    ent_ip = tk.Entry(home)
    ent_ip.pack()
    btn_enter = tk.Button(home, text="Enter", command=retrieve_server_ip)
    btn_enter.pack()

    tk.mainloop()
    return server_ip
    
server_ip = get_server_ip()
print (server_ip)
  

Комментарии:

1. Ваш код получит, None поскольку server_ip это локальная переменная внутри retrieve_server_ip() функции. Добавить nonlocal server_ip внутри этой функции.

2. Спасибо, что сработало. По какой-то причине я никогда не слышал о нелокальной переменной, пока вы не упомянули об этом. Не могу поверить, что я это пропустил.