Fonction qui s'execute sans etre appelée

Résolu/Fermé
Pr.Witherfire - 2 janv. 2023 à 14:52
 Pr.Witherfire - 3 janv. 2023 à 17:48
from tkinter import *
from datetime import datetime
import time

PCHIColor1 = "Black"
PCHIColor2 = "white"
PCHIPolice = "Arial"

class Projet:

    def __init__(self, Nom, Num, Fen, Command1, Command2, Taille, Taille2):

        self.DM = str(datetime.now())
        self.DC = str(datetime.now())
        self.Num = Num
        self.Nom = Nom
        self.Emp = 1
        self.Frame = Frame(Fen, width=400, height=200, bg=PCHIColor1, bd=0)
        self.CCanvas = Canvas(self.Frame, width=400, height=200, bg=PCHIColor2, bd=0)
        self.CCanvas2 = Canvas(self.Frame, width=100, height=200, bg=PCHIColor2, bd=0)
        self.BLancer = Button(self.Frame, text="Lancer     ", bg=PCHIColor2, fg=PCHIColor1, command=Command1(self), font=(PCHIPolice, Taille2), bd=0)
        self.BSupp = Button(self.Frame, text="Supprimer", bg=PCHIColor2, fg=PCHIColor1, command=Command2(self), font=(PCHIPolice, Taille2), bd=0)
        self.LtName = Label(self.Frame, text=self.Nom, bg=PCHIColor2, fg=PCHIColor1, font=(PCHIPolice, Taille), bd=0)

    def Pack(self, X, Y):

        self.Frame.place(x=X, y=Y)
        self.CCanvas.place(x=0, y=150)
        self.CCanvas2.place(x=300, y=0)
        self.BLancer.place(x=300, y=84)
        self.BSupp.place(x=300, y=120)
        self.LtName.place(x=10, y=150)

    def Supp(self):

        self.Frame.destroy()
        self.BLancer.destroy()
        self.BLancer.destroy()
        self.LtName.destroy()



def PCHIFoLancer(self):

    print(self)

def Fo2(self):

    print(self)




fen = Tk()
fen.geometry("1600x900+-8+0")
Project = Projet(Nom="Project", Num=1, Fen=fen, Command1=PCHIFoLancer, Command2=Fo2, Taille=25, Taille2= 15)
Project.Pack(X=500, Y=250)
Project2 = Projet(Nom="TTAM", Num=2, Fen=fen, Command1=PCHIFoLancer, Command2=Fo2, Taille=25, Taille2= 15)
Project2.Pack(X=600, Y=500)
fen.mainloop()

J'ai un petit problème de fonctionqui s'execute sans etre appelée. Je ne pense pas que la réponse soit trop compliquée car, ayant cherché sur google, je n'ai rien trouvé. L'idée est d'appeler une fonction quand un bouton est cliqué. Je ne clique pas, la fonction s'execute, je clique, la fonction ne s'execute pas. Merci d'avance encore une fois pour vos lumieres

A voir également:

2 réponses

Samut,

quelle fonction au juste?

Je voit un objet moi. Quand on crée une instance d'une objet le constructeur est utilisé.

Voir POO

Les fonctions (internes)d'un objet sont appelées méthodes et rien n'empêche d'utiliser une méthode dans le constructeur.

Si vous créez un objet vous appelez son constructeur.

En instanciant(créer un objet à partir du modèle décrit par Class) "Projet" vous créez une zone où va s'exécuter le constructeur stocké dans la variable "Project") et rendez disponible les méthodes par référence à la variable Project.

Je vous conseille de donner des noms différents pour vos instances de classe et vos classes ça sera plus clair. En général on indique les Objects avec une majuscule et les instance en minuscule.

Ces deux habitudes permettent de rendre le programme beaucoup pllus clair et simple à lire sans devoir chercher qu'est ce Project et Projet dans le code. Donner un nom clair c'est assez simple et facilite la vie, par exemple:

class Projet://-- création de la classe

...

instanceProjet=Projet(...//-- instanciation de la classe

Voilà Projet et instanceProjet sont assez différents pour qu'n voie au premier coup d'oeil lequel est le quel sans devoir revenir dans le code.

C'st bien sûr un exemple, il est plus logique de donner un nom en rapport avec le rôle de la classe(ce à quoi elle sert) par exemple:

horloge= Projet(....

Pr.Witherfire
3 janv. 2023 à 17:48

merci mais c'est bien des fonctions appelées par les boutons et non pas les méthodes dont je parlais.

0

Salut, mettre les parenthèses à une fonction/méthode fait un appel à cette fonction, donc normal que Command1(self) appelle  la fonction Command1 (PCHIFoLancer), si on a besoin de passer des arguments à une fonction passée dans l'argument command d'un Button qui attend une référence et non le retour d'une fonction, alors soit on crée une fontion intermédiaire, soit on utilise une fonction anonyme.

self.BSupp = Button(..., command=lambda: Command2(self), ...)
Pr.Witherfire
3 janv. 2023 à 17:47

Ah ok merci beaucoup. Au revoir.

0