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 :

TP du Zcasino


Sujet :

Python

  1. #21
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Très intéressant! Je ne me plongerais pas pleinement dans ton code pour le moment car je veux continuer encore un peu à fouiller, bidouiller avant de me laisser trop influencer par ton travail, mais ce que j'ai pu lire grossièrement me semble très intéressant.

    la toile pullule de liens super intéressant autour de Tkinter et de son fonctionnement. De façon précise j'ai pu donc comprendre que mon travail se scinde en deux parties distinctes : La création de l'interface graphique ( visible ), puis la connection de cette interface ou façade graphique avec la logique du programme. Après plusieurs lecture à droite et à gauche, la première étape du travail est réalisé ( Bravo tu viens de finaliser l'étape la plus simple! Clap, Clap ) me reste à présent à bosser sur la partie logique. Mentalement je suis prêt à recevoir quelques coups! Le gong est sonné, et c'est d'un pas décidé que je progresse dans le ring!


    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
    25
    26
    27
    28
    29
    30
    import tkinter
    from tkinter import* 
    import random
     
    root = Tk()
    root.title = "Memory"
     
     
    conteneur_consignes = Frame(root, bg = 'green', width = 640, height = 150)
    conteneur_consignes.pack(side = TOP, fill = Y)
     
    conteneur_liste = Frame(root, bg = 'blue', width = 640, height = 60)
    conteneur_liste.pack(side = TOP, fill = Y)
     
    conteneur_entry = Frame(root, bg = 'yellow', width = 640, height = 80)
    conteneur_entry.pack(side = TOP, fill = Y)
     
    conteneur_boutons = Frame(root, bg ='red', width = 640, height = 100)
    conteneur_boutons.pack(side = BOTTOM, fill = Y)
     
     
    #insertion de mes widgets#
     
    consignes = Label(conteneur_texte).pack()
    liste = Label(conteneur_liste).pack()
    entry = Entry(conteneur_entry).pack()
    bouton_1 = Button(conteneur_boutons, text = 'Valider').pack(side = LEFT)
    bouton_2 = Button(conteneur_boutons, text = 'Quitter').pack(side = RIGHT)
     
    root.mainloop()

  2. #22
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Bonsoir à tous,

    alors je reviens vers vous tranquillement ce soir avec peu de progression, j'ai le système qui surchauffe. Je lis des sujets à droite à gauche, consulte toute sorte de liens sur Tkinter essaie de m'inspirer de certains code-source mais voilà je pense que la méthode n'est en rien efficace pour moi. Je m'éparpille, me perd et au final rien de bon. J'aurais une unique question concernant mon label qui affiche actuellement ma liste_1. Comment pour ce Label nommé label puis faire appel à la fonction def random() qui me permet de selectionner un élément de la liste, supprimer cet élément puis afficher de nouveau la liste? (Svear j'avoue me perdre un peu dans ton code, peut être un poil poussé pour mon niveau ou ma capacité de compréhension actuelle?)




    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    import tkinter
    from tkinter import* 
    import random
     
    root = Tk()
    root.title('Memory')
     
    # fonctions #
     
    liste_1 = ['cochon, poule, mouton, cheval']
     
     
     
    def random():
        select_object = random.choice(liste_1)
        liste_1.remove(select_object)
        time.sleep(5)
        print(liste_1)
     
     
     
    conteneur_consignes = Frame(root, bg = 'green', width = 640, height = 150)
    conteneur_consignes.pack(side = TOP, fill = Y)
     
    conteneur_liste = Frame(root, bg = 'blue', width = 640, height = 60)
    conteneur_liste.pack(side = TOP, fill = Y)
     
    conteneur_entry = Frame(root, bg = 'yellow', width = 640, height = 80)
    conteneur_entry.pack(side = TOP, fill = Y)
     
    conteneur_boutons = Frame(root, bg ='red', width = 640, height = 100)
    conteneur_boutons.pack(side = BOTTOM, fill = Y)
     
     
    #insertion de mes widgets#
     
    consignes = Label(conteneur_consignes, text = 'Cette application est une application de type memory très simple.\n'
                      'Observez attentivement la liste ci-dessous').pack()
    liste = Label(conteneur_liste,text = liste_1, font = 'helvetica 12 bold').pack()
    entry = Entry(conteneur_entry).pack()
    bouton_1 = Button(conteneur_boutons, text = 'Valider').pack(side = LEFT)
    bouton_2 = Button(conteneur_boutons, text = 'Quitter', command = root.destroy).pack(side = RIGHT)
     
    root.mainloop()
     
    #connection avec l'interface graphique#

  3. #23
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par suppadrakn Voir le message
    J'aurais une unique question concernant mon label qui affiche actuellement ma liste_1. Comment pour ce Label nommé label puis faire appel à la fonction def random() qui me permet de selectionner un élément de la liste, supprimer cet élément puis afficher de nouveau la liste?
    Faut que tu rajoutes "command=fonctionX" quand tu crées ton bouton. Et la fonctionX en question doit modifier la liste puis la réafficher. Bref la fonctionX c'est ta fonction random quoi (sauf que lui donner le nom d'un module déjà existant... ). Et cette dernière, au lieu d'afficher à l'écran, doit afficher dans Tk. Mais pour ça, il faut d'abord affecter au Label un StringVar car c'est sa modification par ladite fonction qui sera répercutée dans Tk.

    Et ta liste n'est pas une liste mais une chaine. En effet, en Python, ce qui fait une liste (ou un tuple) ce ne sont pas les crochets mais la virgule (effectivement piège où tout le monde tombe un jour).
    Ainsi
    a=[1] => entier => identique à a=1...
    a=[1,] => liste => identique à a=1, (mais les crochets renforcent bien évidemment la compréhension et la relecture).

    Et toi tu as écrit liste_1 = ['cochon, poule, mouton, cheval'] (avec un seul guillement au début et un seul à la fin) => une unique chaine

    Dernier détail: si tu écris bouton=Button(...) alors ta variable "bouton" devient un objet de type "Button" et utilisable comme tel. Mais si tu écris bouton=Button(...).pack(...), alors ta variable "bouton" ne récupère que ce qui est renvoyé par la méthode pack(). Ca peut-être un bouton (mais ce serait un gros hasard et le hasard n'est pas de mise en prog) ou plus probablement un truc qui a de l'importance pour Tk mais dont tu ne pourras pas te servir en tant que "Button".
    Ceci dit, créer une variable pour ne pas l'utiliser est un peu inutile.

    Voici ton code rectifié
    Code python : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #!/usr/bin/env python 
    # -*- coding: utf-8 -*-
     
    from Tkinter import* 
    import random
     
    root = Tk()
    root.title('Memory')
     
    # fonctions #
     
    liste = ['cochon', 'poule', 'mouton', 'cheval']
     
    def cache():
        global xxx
        global liste
        select_object = random.choice(liste_1)
        liste.remove(select_object)
        xxx.set(liste)
    # cache()
     
    conteneur_consignes = Frame(root, bg = 'green', width = 640, height = 150)
    conteneur_consignes.pack(side = TOP, fill = Y)
     
    conteneur_liste = Frame(root, bg = 'blue', width = 640, height = 60)
    conteneur_liste.pack(side = TOP, fill = Y)
     
    conteneur_entry = Frame(root, bg = 'yellow', width = 640, height = 80)
    conteneur_entry.pack(side = TOP, fill = Y)
     
    conteneur_boutons = Frame(root, bg ='red', width = 640, height = 100)
    conteneur_boutons.pack(side = BOTTOM, fill = Y)
     
    #insertion de mes widgets#
     
    consignes = Label(
        conteneur_consignes,
        text = 'Cette application est une application de type memory très simple.\nObservez attentivement la liste ci-dessous',
    ).pack()
    xxx=StringVar()
    xxx.set(", ".join(x for x in liste))
    Label(conteneur_liste, textvariable = xxx, font = 'helvetica 12 bold').pack()
    Entry(conteneur_entry).pack()
    Button(
        conteneur_boutons,
        text = 'Valider',
        command=cache,
    ).pack(side = LEFT)
    Button(
        conteneur_boutons,
        text = 'Quitter',
        command = root.destroy,
    ).pack(side = RIGHT)
     
    root.mainloop()
     
    #connection avec l'interface graphique#

    Comme tu le vois, obligation hélas de passer par des variables globales ce qui est passable ici mais une très mauvaise chose si on commence à en prendre l'habitude.

    Accessoirement ma façon de faire ne touche pas la liste originelle (je me contente juste de la réafficher en masquant l'élément choisi). Toi tu as décidé de modifier la liste originelle en lui enlevant l'élément choisi. Ce sont deux façons de faire qui sont possibles (selon ce que veut faire le programmeur) mais cela produit le comprtement suivant
    • dans ma version, réappuyer plusieurs fois sur le bouton réaffiche toujours la liste entière (à un élément près). Ca permet de faire plusieurs jeux d'affilée.
    • dans ta version (corrigée selon l'idée que j'ai de ce que tu veux faire au vu de ton premier code), réappuyer sur le bouton affiche une liste de plus en plus réduite. Ca permet de faire plusieurs jeux de difficulté décroissante. Sauf qu'il faut penser à tester quand la liste est devenue vide sinon bug


    Citation Envoyé par suppadrakn Voir le message
    (Svear j'avoue me perdre un peu dans ton code, peut être un poil poussé pour mon niveau ou ma capacité de compréhension actuelle?)
    Pas grave. Réexamine-le tranquillement. Commence par l'objet cLabel. C'est un objet qui hérite d'un Label (il hérite de toutes ses possibilités d'un vrai Label Tk) mais simplement enrichi d'un StringVar et d'une méthode permettant de le modifier. Ainsi cet objet est un "tout" contenant le Label et le StringVar qui lui est obligatoire. Mais il est totalement utilisable comme un vrai Label (magie de l'héritage).

    Ensuite l'objet cEntry basé sur le même principe mais pour une saisie donc héritant d'un Entry Tk et enrichi d'une méthode permettant de récupérer la zone saisie.

    Et un gros objet héritant du Tk de base dans lequel je crée tout le reste (les boutons, l'affichage, etc) et bien entendu qui utlise mon cLabel et mon cEntry en lieu et place d'un Label et Entry originaux. Et comme toute méthode (fonction) d'un objet a accès aux propriétés (variables) dudit objet, ça me permet de ne pas utiliser de globales.

    Ceci dit, ton exemple m'a permis de découvrir la méthode de positionnement des objets Tk (les Frame permettant d'englober d'autres objets) et j'aime bien (il y a la même notion en Qt bien entendu mais avec d'autres paramètres de positionnement). Je vais peut-être faire qq trucs de bases en Tk (des outils en lignes de commande que j'utilise dans mon travail)...

    Voici mon programme repris avec un meilleur positionnement des éléments grâce à toi

    Code python : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
    import random
     
    class cJeu(Tk):
     
    	# Variables statiques
    	__liste=["cochon", "renard", "abeille", "poule"]
     
    	# Constructeur
    	def __init__(self):
    		# Création de l'objet par appel de la méthode init héritée de l'objet d'origine
    		Tk.__init__(self)
     
    		# Initialisation variables de jeu
    		self.__hiddenObj=None				# Objet caché
     
    		# Mise en forme
    		self.title('Petit jeu')
    		self.geometry('500x150+400+400')
     
    		# Création d'un widget d'affichage liste
    		self.__listLabel=cJeu.cLabel(
    			self,
    			text=", ".join(x for x in cJeu.__liste),
    			fg='red',
    			bg='white',
    		)
    		self.__listLabel.pack(side=TOP, padx=0, pady=5, fill=Y)
     
    		# L'espace de rangement des boutons
    		btnFrame=Frame(self)
    		btnFrame.pack(side=TOP, fill=Y, padx=0, pady=5)
     
    		# Création du bouton "jouer"
    		Button(
    			btnFrame,
    			text='Jouer',
    			command=self.__cacheElem,
    		).pack(side=LEFT, padx=5, pady=0)
     
    		# Création du bouton "quitter"
    		Button(
    			btnFrame,
    			text='Quitter',
    			command=self.destroy,
    		).pack(side=RIGHT, padx=5, pady=0)
     
    		# Création d'un widget de saisie
    		self.__listSaisie=cJeu.cEntry(
    			self,
    			fg='blue',
    			bg='white',
    		)
    		self.__listSaisie.pack(side=TOP, fill=Y, padx=0, pady=5)
     
    		# Création d'un widget d'affichage résultat
    		self.__listResult=cJeu.cLabel(
    			self,
    			fg='blue',
    			bg='white',
    		)
    		self.__listResult.pack(side=TOP, fill=Y, padx=0, pady=5)
    	# __init__()
     
    	# Suppression d'un élément
    	def __cacheElem(self):
    		self.__hiddenObj=random.choice(cJeu.__liste)
       		self.__listLabel.set_text(
    			", ".join(x for x in cJeu.__liste if x != self.__hiddenObj)
    		)
    	# __cacheElem()
     
    	# Vérification saisie
    	def Verif(self, event):
    		# S'il n'y a pas d'élément caché, on ne joue pas
    		if self.__hiddenObj is None: return
     
    		# Affichage gagné/perdu selon l'élément saisi
    		self.__listResult.set_text(
    			"Gagné"\
    				if self.__listSaisie.get_text() == self.__hiddenObj\
    				else "Perdu"
    		)
    	# Verif()
     
    	# Une classe pour gérer un label avec son texte
    	class cLabel(Label):
    		# Constructeur
    		def __init__(self, parent, *args, **kwargs):
    			# Mémorisation widget parente
    			self.__parent=parent
     
    			# Le texte
    			self.__texte=StringVar()
     
    			# Création de l'objet par appel de la méthode init héritée de l'objet d'origine
    			Label.__init__(
    				self, 
    				textvariable=self.__texte,
    				*args,
    				**kwargs
    			)
     
    			# S'il y a un texte à afficher
    			if "text" in kwargs.keys() and kwargs["text"] is not None:
    				self.set_text(kwargs["text"])
    		# __init__()
     
    		# Positionnement texte
    		def set_text(self, texte): self.__texte.set(texte)
    	# class cLabel
     
    	# Une classe pour gérer une saisie avec son texte
    	class cEntry(Entry):
    		# Constructeur
    		def __init__(self, parent, *args, **kwargs):
    			# Mémorisation widget parente
    			self.__parent=parent
     
    			# Le texte
    			self.__texte=StringVar()
     
    			# Création de l'objet par appel de la méthode init héritée de l'objet d'origine
    			Entry.__init__(
    				self, 
    				textvariable=self.__texte,
    				*args,
    				**kwargs
    			)
     
    			# L'appui sur return déclenchera la vérification
    			self.bind('<Key-Return>', self.__parent.Verif)
    		# __init__()
     
    		# Récupération saisie
    		def get_text(self): return self.__texte.get()
    	# class cEntry
    # class cJeu
     
    cJeu().mainloop()
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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