IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

fonction lambda associée à un bouton de menu [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Par défaut fonction lambda associée à un bouton de menu
    Bonjour

    J'ai actuellement des boutons de menu qui lorsqu'ils sont sélectionnés déclenchent l'affichage d'une boite de dialogue pour la mise modification d'une variable.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    serial_port_menu.add_command(label='Choose baud rate... ', command=choose_baud_rate)
    avec la fonction appelée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def choose_baud_rate():
    	"""
            Ask for and return a new baud rate speed
            """
    	global baud_rate
    	baud_rate = int(ask_for_value(
    		title_text='Choose baudrate speed.', 
    		message='Specify the baud rate value.', 
    		initial_value=baud_rate))
    	print(f'New baud rate is : {baud_rate}')
    Ca fonctionne, mais le fait de devoir mettre la variable baud_rate en global ne me plait pas.

    Je souhaitais donc modifier cela en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def choose_baud_rate(actual_baud_rate):
    	"""
            Ask for and return a new baud rate speed
            """
    	newBaudRate = int(ask_for_value(
    		title_text='Choose baudrate speed.', 
    		message='Specify the baud rate value.', 
    		initial_value=actual_baud_rate))
    	print(f'New baud rate is : {newBaudRate}')
    	return newBaudRate
    et réaliser l'appel par une fonction lambda directement au niveau du bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    serial_port_menu.add_command(label='Choose baud rate... ', command=lambda: baud_rate = choose_baud_rate(actual_baud_rate=baud_rate))
    Vous voyez l'idée ?...
    Le problème c'est que je ne comprend pas comment rédiger la fonction lambda pour lui faire exécuter baud_rate = choose_baud_rate(actual_baud_rate=baud_rate)) pour qu'elle exécute choose_baud_rate et assigne la valeur retournée à baud_rate

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par scarou Voir le message
    Ca fonctionne, mais le fait de devoir mettre la variable baud_rate en global ne me plait pas.
    Il faut que ce soit l'attribut d'un objet qui survivra après la sortie de la fonction (et le déréférencement de toutes les variables locales).
    Le module courant est un bon candidat et "global" n'est qu'une façon commode pour accéder à cet objet la avec une syntaxe particulière.
    Maintenant, vous pouvez utiliser un dictionnaire ou créer une class config qui stockera cet attribut là et d'autres. La seule différence sera de ne pas avoir à écrire "global" pour que config.baud_rate = ... fonctionne. Sauf à ajouter un argument à choose_baud_rate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def choose_baud_rate(config):
          config.baud_rate = ...
    puis côté Button:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...add_command(..., command=lambda config=config: choose_baud_rate(config))
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Par défaut
    Merci !

    Il m'a fallu un peu de temps pour assimiler le sens de ce que tu disais, mais ça m'a permis de résoudre mon problème et de découvrir l'usage d'une classe dédiée comme conteneur (bien pratique )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class config():
    	port_COM ='com14'
    	baud_rate = 115200
     
    	DATA_FILENAME = 'Data_log.csv'
     
    	LARGE_FONT = ("Verdana", 12)
    	NORM_FONT = ("Verdana", 10)
    	SMALL_FONT = ("Verdana", 8)
     
     
    def choose_baud_rate(config_class_name):
    	"""
            Ask for and change the baud rate speed
            """
    	config.baud_rate = int(ask_for_value(
    		title_text='Choose baudrate speed.', 
    		message='Specify the baud rate value.', 
    		initial_value=config.baud_rate))
    	print(f'New baud rate is : {config.baud_rate}')
     
    ...
    serial_port_menu.add_command(label='Choose baud rate... ', command=lambda config_class_name=config : choose_baud_rate(config))
    ...
    Du coup j'ai encore un peu de ménage à faire dans mon code pour implémenter toutes ces modifs. (C'est d’ailleurs pile à ce moment que je rend compte en la poo est utile et que je ne suis probablement pas allé encore assez loin dans la factorisation des tâches )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] Associer un bouton a une fonction et recuperer la valeur
    Par thomcake dans le forum Tkinter
    Réponses: 1
    Dernier message: 23/01/2015, 18h15
  2. fonction "lambda" dans commande bouton
    Par Farmer64 dans le forum Tkinter
    Réponses: 7
    Dernier message: 19/07/2012, 22h37
  3. Réponses: 0
    Dernier message: 11/04/2009, 16h54
  4. Associer différentes commandes à un bouton de menu
    Par nonozor dans le forum Tcl/Tk
    Réponses: 9
    Dernier message: 02/05/2008, 21h16
  5. fonction associée un bouton de type submit
    Par NicoO_O dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/04/2007, 08h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo