Forum >> Programmazione Python >> GUI >> Novizio con problema tkinter

Pagina: 1

Messaggio annotato da Daniele aka Palmux :
Questa discussione è stata spostata dalla categoria Principianti.
Ciao forum :) Sono Diego e mi sono da poco affacciato al mondo della programmazione.
Vengo al punto: Ho iniziato da poco a lavorare con il modulo tkinter e nonostante inizialmente non abbia avuto problemi, mi sono bloccato. Vi allego il codice

from tkinter import *

root = Tk()

def CambioColore(color):
    root["bg"] = color

P = Menu(root)
M1 = Menu(P)
P.add_cascade (label = "Colore", menu = M1)
M1.add_command (label = "Sfondo rosso", command = CambioColore("red"))
M1.add_command (label = "Sfondo verde", command = CambioColore("green"))

root.config (menu = P)


Come vedete sto lavorando con i menù. Il codice è minimale, lo scopo è solo quello di creare un menù con due opzioni che cambino rispettivamente il colore della finestra principale in rosso e verde. Il problema è il risultato, infatti il codice non appena eseguito crea una finestra totalmente verde (in base all'ultima funzione chiamata), mentre il menù a tendina non esegue alcun comando. Cercando su internet sono riuscito a risolvere il problema cambiando le istruzioni di comando in questo modo:

M1.add_command (label = "Sfondo rosso", command = lambda: CambioColore("red"))
M1.add_command (label = "Sfondo verde", command = lambda: CambioColore("green"))
Il programma così scritto si comporta esattamente come deve. Solo non capisco perché questo risolva il problema. Perché chiamando la funzione con lambda funziona, mentre chiamandola normalmente le funzioni vengono eseguite in automatico? Ci tengo a precisare che mi sono informato sulle funzioni lambda e sul loro funzionamento, ma ancora non ci arrivo :thinking:


--- Ultima modifica di DiegoS in data 2017-10-29 19:17:05 ---
Nel primo caso non funziona perché il parametro 'command' vuole il nome di una funzione da chiamare, non il risultato della chiamata di una funzione (a meno che il risultato sia a sua volta una funzione, ma non è questo il caso).

Nel secondo caso funziona perché 'lambda' crea e restituisce una funzione (senza nome, ma che viene assegnata al parametro 'command'), che quando chiamata a sua volta chiama la funzione che hai specificato.

L'uso delle funzioni come oggetti da passare/ritornare, e non solo come subroutine da chiamare, è comunque una caratteristica "avanzata", ma fa parte del modo estremamente generale di Python di trattare qualsiasi cosa come un generico oggetto (dai dati elementari ai moduli).


--- Ultima modifica di Claudio_F in data 2017-10-30 20:50:52 ---
*** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
Grazie mille per il chiarimento. Ne stavo uscendo matto ;)


Pagina: 1



Esegui il login per scrivere una risposta.