Почему функции из словаря на Python работают без их вызова

Я пишу программку для своих нужд на tkinter и питон. По нажатию на кнопку функция getParameters должна в цикле сравнить значение массива со словарем. И если какое-то значение массива, совпадет с ключём словаря, чтобы из словаря вызывалась функция по ключу. Но на деле программа работает так, что программа вызывает все функции какие есть в словаре без участия цикла. Подскажите, как исправить. Прошу не обращать внимания, что интерфейс программы куцый. Так сделано специально, чтобы суть проблемы было видно.

 from tkinter import *
    win2 = Tk()

    def receive_of_word():
        param = "55"
        return param

    def word(param):
        x = 5
        print(x)
        return x

    def word_2(param):
        y = 10
        print(y)
        return y

    def getParameters():
        ex ={
          "xx": word(receive_of_word()),
          "yy": word_2(receive_of_word()),
          }

        a = ["xx", "zz"]

        for i in a:
            if i in ex:
                ex[i]


    win2.title('Программа')
    win2.minsize(width = 600, height = 600)
    win2.maxsize(width = 600, height = 600)

    button2 = Button(win2, text = "Считать текст", command = getParameters, width = 20, height = 3, font = "Arial 8", bg = "#edf3fc", foreground = "#000000", activebackground = "#ffffff", relief = RAISED)
    button2.place(relx = 0.35, rely = 0.56)
    button2.bind()

    mainloop()

Ответы (1 шт):

Автор решения: CrazyElf

Так происходит потому, что в том месте, где вы объявляете словарь вы уже вызываете эти функции. Чтобы не вызывать функции, а куда-то передать, пишите их без скобок, просто названия. А там, где надо их вызывать - там уже пишите скобки. И ещё у вас аргумент param почему-то вообще не используется в функциях word и word_2, но в данном случае это не влияет на результат.

from tkinter import *
win2 = Tk()

def receive_of_word():
    param = "55"
    return param

def word(param):
    x = 5
    print(x)
    return x

def word_2(param):
    y = 10
    print(y)
    return y

def getParameters():
    ex ={
      "xx": (word,receive_of_word),
      "yy": (word_2,receive_of_word),
    }

    a = ["xx", "zz"]

    for i in a:
        if i in ex:
            f1,f2 = ex[i]
            f1(f2())


win2.title('Программа')
win2.minsize(width = 600, height = 600)
win2.maxsize(width = 600, height = 600)

button2 = Button(win2, text = "Считать текст", command = getParameters, width = 20, height = 3, font = "Arial 8", bg = "#edf3fc", foreground = "#000000", activebackground = "#ffffff", relief = RAISED)
button2.place(relx = 0.35, rely = 0.56)
button2.bind()

mainloop()
→ Ссылка