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 :

Tkinter : Se débarrasser des variables globales ? [Python 2.X]


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2016
    Messages : 34
    Points : 115
    Points
    115
    Par défaut Tkinter : Se débarrasser des variables globales ?
    Salutations,

    J'ai pour objectif de créer un jeu d'échecs en graphique et le mettre sur un serveur pour jouer en wifi local avec mes colocs (et pour apprendre au passage). Pour le moment je compte faire des tests avec un TicTacToe en graphique (plus simple pour les conversation client/serveur). Donc je suis en train de faire mon TicTacToe mais je débute seulement avec Tkinter. Je suis assez frustré car son utilisation est vraiment différente de SDL à laquelle je suis habitué en C.

    J'aurais donc voulu savoir si dans mon code suivant (fonctionnel) :

    http://pastebin.com/SMLpWi3j

    - Je peux me passer de mes variables "Player" et "i" (j'utilise ça car je ne sais pas comment retourner de valeur lors de l'appel de ma fonction "pointeur' puisque celle-ci est appelée dans mon canvas.)
    - Vous voyez des autres aberrations et améliorations possible

    Merci de m'avoir lu et de vos éventuelles réponses

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Falquiero Voir le message
    'aurais donc voulu savoir si dans mon code suivant (fonctionnel) :

    http://pastebin.com/SMLpWi3j

    Je peux me passer de mes variables "Player" et "i" (j'utilise ça car je ne sais pas comment retourner de valeur lors de l'appel de ma fonction "pointeur' puisque celle-ci est appelée dans mon canvas.)
    Un "callback" (c'est le nom qu'on donne à une fonction telle que "pointeur") est appelée par tkinter et son retour sera capturé par tkinter. Si vous voulez que l'évènement qui déclenche son exécution modifie l'état de votre programme (et ce qui sera affiché par l'interface graphique), il va bien falloir que cet état existe en dehors de l'exécution de la fonction...
    Et donc stocké dans des objets qui auront une durée de vie plus grande que celui ou la fonction est active.
    Les variables globales (associés à l'objet "module") sont une solution.
    La POO en est une autre: elle permet de fabriquer des "méthodes" qui sont aussi des fonctions mais associée à un objet pouvant avoir plusieurs attributs (player, i,...). Et entre les deux vous avez des "closures" qui sont des fonctions imbriquées dans d'autres fonctions permettant de créer d'autres types de variables.

    Ceci dit, vu l'état de votre code, prenez le temps d'apprendre les bases:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while fini(board) == False:
            canvas1.bind("<Button-1>", pointeur)
            actualise(board)
            fenetre1.update()
    Pourquoi effectuer un "canvas1.bind("<Button-1>", pointeur)" à chaque itération?
    Pourquoi tester "fini(board)" ou appeler "actualise(board)" dans une boucle infinie alors qu'il suffit de le faire qu'après un changement d'état de votre programme? Cà fonctionne certes mais çà fait surtout mouliner le CPU pour pas grand chose. Et çà montre aussi que vous n'avez pas trop regardé comment fonctionne un GUI comme tkinter.
    Vous avez aussi des tas de if...elif...elif...elif pour tester dans quel carré on à cliqué.
    Avec un canvas de 300x300 découpé en carreaux de 100x100, pour trouver les indices d'un carreau à partir de la position (x, y) du click le quotient de la division de x et y par 100 suffit largement, non?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2016
    Messages : 34
    Points : 115
    Points
    115
    Par défaut
    Merci d'avoir pris le temps de répondre.

    Je n'ai effectivement pas pris la peine de comprendre en profondeur le fonctionnement de tkinter tant cette mise en place d'interface est pour moi du pur yak shaving. Je me suis retrouvé en bidouillant un peu (étonnamment d'ailleurs) avec un code "fonctionnel".
    Je suis assez fâché avec l'oop et c'est pourquoi j'ai pas tant chercher à comprendre les méthode (le mainloop aussi est très flou). Je vais donc passer à pygame qui je pense conviendra mieux à ce que je veux faire (à moi même au passage )

    Merci cependant pour les précisions. Je reviendrais plus tard pour l'oop, et vais essayer d'apprendre à lire une doc.

    Cordialement.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Falquiero Voir le message
    Je suis assez fâché avec l'oop et c'est pourquoi j'ai pas tant chercher à comprendre les méthode (le mainloop aussi est très flou). Je vais donc passer à pygame qui je pense conviendra mieux à ce que je veux faire (à moi même au passage )
    Il faut prendre le temps de lire un tuto. comme le Swinnen, il explique très bien ce qu'est une mainloop et comment çà fonctionne.

    Avec pygame, on doit écrire sa mainloop pour y appeler directement les fonctions qu'il faut suivant le cas de figure.
    Il n'y a pas de notion de "callback" mais il y a quand même un état global à matérialiser dans des variables qu'elles soient attributs de module ou d'instances de classe.

    Citation Envoyé par Falquiero Voir le message
    Je n'ai effectivement pas pris la peine de comprendre en profondeur le fonctionnement de tkinter tant cette mise en place d'interface est pour moi du pur yak shaving. Je me suis retrouvé en bidouillant un peu (étonnamment d'ailleurs) avec un code "fonctionnel".
    pygame permet d'avoir la main sur les fonctionnalités OpenGL mais côté fonctionnalités, c'est assez rustique par rapport à un GUI comme tkinter: il faudra écrire plus de lignes de code. Et si vous voulez avoir des fonctionnalités intéressantes, plus de lignes de code à organiser sans s'aider de la POO, c'est souvent ré-inventer la roue.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2016
    Messages : 34
    Points : 115
    Points
    115
    Par défaut
    Je prend note.

    Merci de votre patience

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

Discussions similaires

  1. [C#] Peut-on avoir des variables globales ?
    Par Seth77 dans le forum C#
    Réponses: 7
    Dernier message: 10/09/2006, 16h07
  2. comment faire des variables globales
    Par user_ensias dans le forum Struts 1
    Réponses: 3
    Dernier message: 07/09/2006, 10h03
  3. portée des variables globales dans un fichier js
    Par crakazoid dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 14/04/2006, 16h49
  4. utilisation des variables global dans tout le projet
    Par EYENGA Joël dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/01/2006, 10h55
  5. De la bonne pratique des variables globales...
    Par say dans le forum C++Builder
    Réponses: 9
    Dernier message: 25/11/2005, 09h47

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