Есть ли способ изменить глобальное значение изнутри функции?

#python #button #tkinter #command #tk

#python #кнопка #tkinter #команда #tk-toolkit

Вопрос:

В настоящее время я работаю над игрой в змею, но сначала я хочу, чтобы появилось окно настроек. для этого я использовал tkinter. В небольших проектах я просто записал весь код в функцию pressButton, но сейчас я хочу иметь код, отличный от spagetti, поэтому я не собираюсь с этим. Проблема в том, что я понятия не имею, как получить введенные значения в скобках ввода в мой основной код в качестве глобальных переменных из функции pressButton и функции settingsWin . Проблема в том, что я использую функцию как команду для кнопки, поэтому я не могу использовать «return». Можете ли вы изменить глобальные переменные в основном коде непосредственно изнутри функции? Если да, то как? Или есть другой способ решить эту проблему? Мой код:

 def settingsWin():

    def pressButton():
        len = entryLen.get()
        wid = entryWid.get()
        speed = entrySpeed.get()
        print(len wid speed)
        SettingsWin.destroy()
        return len

    SettingsWin = Tk()
    SettingsWin.geometry("600x600")
    SettingsWin.title("Settings")
    label1 = Label(SettingsWin, text="playing field [tiles]")
    label1.pack()
    entryLen = Entry(SettingsWin, bd=2, width=20)
    entryLen.pack()
    label2 = Label(SettingsWin, text="X")
    label2.pack()
    entryWid = Entry(SettingsWin, bd=2, width=20)
    entryWid.pack()
    labelblanc = Label(SettingsWin, text="")
    labelblanc.pack()
    label3 = Label(SettingsWin, text="Speed [ms per tick]")
    label3.pack()
    entrySpeed = Entry(SettingsWin, bd=2, width="20")
    entrySpeed.pack()
    okButton = Button(SettingsWin, text="OK", command=pressButton)
    okButton.pack()


    SettingsWin.mainloop()

len = "len"
wid = "wid"
speed = "speed"
  

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

1. Вы можете ответить на этот вопрос с помощью стандартной документации python. docs.python.org/3/faq /… и docs.python.org/3/reference/simple_stmts.html#global

2. вам просто нужно определить переменную как global x = 1 , и вы можете изменить ее внутри функции как global x=3

3. Что плохого в том, чтобы сказать global len, wid, speed внутри функции presssButton() ?

Ответ №1:

Часто бывает признаком запаха кода требовать, чтобы функция изменяла переменные в областях вне функции (за исключением, возможно, случаев замыкания, которые весьма полезны), это можно сделать с помощью global ключевого слова:

 greeting = "Hello world!"

def greet():
    global greeting
    greeting = "Goodbye world!"

print(greeting)

greet()

print(greeting)
  

Объявляя переменную greeting глобальной области видимости, изменение переменной в определении функции позволяет функции влиять на глобальную переменную.

Если вы работаете во вложенных подразделениях, nonlocal ключевое слово обеспечит доступ во внутреннем подразделении к переменной во внешнем подразделении. Он работает аналогично global , за исключением того, что он предназначен для более широкой лексической области, а не для глобальной области.

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

1. Спасибо, это было то, что я искал 🙂