CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : [ HELP ] Des kheys qui s'y connaissent en Python?

DébutPage précedente
1
Page suivantePage suivante
Pseudo supprimé
Niveau 7
07 février 2016 à 14:58:49

Ma fenêtre "Regles" bug, le bouton "jouer" ne fonctionne pas et je n'arrive pas à comprendre pourquoi... Quelqu'un peut m'expliquer SVP

voici le code :

from tkinter import *

def a():
Menu.destroy()
Regle = Tk()
Regle.title('Regles du jeu')
label = Label(Regle, text=" les regles sont simples : ...").pack()
bJeu2 = Button(Regle, text='Jouer', command = c).pack()

def b():
Menu.destroy()
Jeu = Tk()
Canvas(Jeu, width=250, height=100, bg='blue').pack()

def c():
Regle.destroy()
Jeu = Tk()

Menu = Tk()
Menu.title('Executeur')
Canvas(Menu, width=250, height=100, bg='red').pack()
bRegle = Button(Menu, text='Regle', command = a).pack(side=RIGHT, padx=5, pady=5)
bJeu = Button(Menu, text= 'Jouer', command= b).pack(side=LEFT, padx=5, pady=5)

mainloop()

aiglefeu aiglefeu
MP
Niveau 6
07 février 2016 à 22:12:59

Ok alors déjà ça peut pas marcher parceque à chaque fois tu supprimes quelque chose qui n'éxiste pas Menu.destroy() Des le début sans créer de fenêtre "Menu" il va pas aimé. Du coup repense un petit peu le fonctionnement de ton programme parceque là avant de créer il supprime.

Pseudo supprimé
Niveau 7
07 février 2016 à 22:48:16

Le 07 février 2016 à 22:12:59 aiglefeu a écrit :
Ok alors déjà ça peut pas marcher parceque à chaque fois tu supprimes quelque chose qui n'éxiste pas Menu.destroy() Des le début sans créer de fenêtre "Menu" il va pas aimé. Du coup repense un petit peu le fonctionnement de ton programme parceque là avant de créer il supprime.

Pourtant bRegle qui se situe dans la fenêtre Menu fonctionne bien,donc la commande a fonctionne bien, c'est la commande c qui bug.
Pourquoi bJeu2 dans la fenêtre règle ne fonctionne pas, je ne comprend vraiment pas (je suis débutant en programmation)

Le seul problème enfaîte c'est que la fenêtre Regle ne se ferme pas quand j'appuie sur le bouton bJeu2, mais il ouvre bien une fenêtre Jeu par dessus la fenêtre Regle :question:

le débugger dit:
" Regle.destroy()
NameError: name 'Regle' is not defined "

Message édité le 07 février 2016 à 22:51:14 par
TheRealMarco TheRealMarco
MP
Niveau 10
07 février 2016 à 23:08:25

le débugger dit:

" Regle.destroy()
NameError: name 'Regle' is not defined "

J'ai jamais fait de Python mais ça me semble assez clair. Tu tentes de supprime un objet nomme Regle avant même de le créer. Ça rejoint l'idée d'aiglefeu. :noel:

Gaetano-GX Gaetano-GX
MP
Niveau 15
09 février 2016 à 08:50:15

Le 07 février 2016 à 23:08:25 TheRealMarco a écrit :

le débugger dit:

" Regle.destroy()
NameError: name 'Regle' is not defined "

J'ai jamais fait de Python mais ça me semble assez clair. Tu tentes de supprime un objet nomme Regle avant même de le créer. Ça rejoint l'idée d'aiglefeu. :noel:

Idem, jamais fais de Python, mais ça a l'air sympa comme langage.

_Rain _Rain
MP
Niveau 9
09 février 2016 à 14:57:05

T'instancie ton objet règle dans a() et tu le supprime dans b(), cependant b() n'a pas la vue sur Regle. Il faut donc que tu declare Regle de maniere global ensuite ça marchera. Ton isntanciation dans a() devra bien évidemment se faire sur la variable Regle declaré en global.

P.S: aiglefeu a faux, le menu n'est pas détruit avant sa création, en effet sa destruction se trouve dans la methode a() executé aprés sa création.

Bon courage

CHAT0N_BARBARE CHAT0N_BARBARE
MP
Niveau 10
09 février 2016 à 18:04:56

Le 09 février 2016 à 14:57:05 _Rain a écrit :
T'instancie ton objet règle dans a() et tu le supprime dans b(), cependant b() n'a pas la vue sur Regle. Il faut donc que tu declare Regle de maniere global ensuite ça marchera. Ton isntanciation dans a() devra bien évidemment se faire sur la variable Regle declaré en global.

Bon courage

c'est donc bien ce qui me semblait, mais comment déclare t'on une fenêtre en variable avec python sans l'ouvrir? :question:

_Rain _Rain
MP
Niveau 9
09 février 2016 à 19:08:39

C'est pas une question de fenêtre n'y de python c'est un principe de programmation de base. La création d'un objet se fait en deux étapes. Premièrement tu réserve un bloc mémoire qui va accueillir ton objet (pour résumer) c'est ce qui est à gauche du égale (regle) appelé variable. Ensuite tu remplis ton bloc mémoire avec un objet (r = Tk()).

Pour faire ce que tu veux, ces deux étapes ne peuvent être effectuées en même temps. Tu dois donc effectuer la première étape de manière globale pour que tout le petit monde y ait accès et effectuer l'instanciation (partie droite) dans ta méthode.

La manière générale pour faire cette manipulation c'est d'attribuer une valeur "null" à ton bloc mémoire en premier lieu. En python je crois que l'équivalent c'est "none".

Prends le temps d'assimiler tout ca et n'essaye pas d'aller trop vite les bases sont le plus important.

P.S: Arrêtés d'utiliser des noms de variable commençant par une majuscule, c'est une habitude que tu ne devrais pas prendre.

_Rain _Rain
MP
Niveau 9
09 février 2016 à 19:16:17

Je n'arrive pas à editer sur mobile mais c'est regle =Tk(), pas r.

CHAT0N_BARBARE CHAT0N_BARBARE
MP
Niveau 10
09 février 2016 à 20:11:46

Le 09 février 2016 à 19:08:39 _Rain a écrit :
C'est pas une question de fenêtre n'y de python c'est un principe de programmation de base. La création d'un objet se fait en deux étapes. Premièrement tu réserve un bloc mémoire qui va accueillir ton objet (pour résumer) c'est ce qui est à gauche du égale (regle) appelé variable. Ensuite tu remplis ton bloc mémoire avec un objet (r = Tk()).

Pour faire ce que tu veux, ces deux étapes ne peuvent être effectuées en même temps. Tu dois donc effectuer la première étape de manière globale pour que tout le petit monde y ait accès et effectuer l'instanciation (partie droite) dans ta méthode.

La manière générale pour faire cette manipulation c'est d'attribuer une valeur "null" à ton bloc mémoire en premier lieu. En python je crois que l'équivalent c'est "none".

Prends le temps d'assimiler tout ca et n'essaye pas d'aller trop vite les bases sont le plus important.

J'ai fais ce que tu as dis je crois :

from tkinter import *

regle=None

def a():
menu.destroy()
regle = Tk()
regle.title('Regles du jeu')
label = Label(regle, text=" les regles sont simples : ...").pack()
bJeu2 = Button(regle, text='Jouer', command = c).pack()

def b():
menu.destroy()
jeu = Tk()
Canvas(jeu, width=250, height=100, bg='blue').pack()

def c():
regle.destroy()
jeu = Tk()

menu = Tk()
menu.title('Executeur')
Canvas(menu, width=250, height=100, bg='red').pack()
bRegle = Button(menu, text='Regle', command = a).pack(side=RIGHT, padx=5, pady=5)
bJeu = Button(menu, text= 'Jouer', command= b).pack(side=LEFT, padx=5, pady=5)

mainloop()

Le débugger affiche :

File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
return self.func(*args)
File "F:\Pyscripter interface graphique executeur.py", line 18, in c
regle.destroy()
AttributeError: 'NoneType' object has no attribute 'destroy'

j'ai tout essayé ou presque , personne n'a d'autres solutions à me proposer svp?

Message édité le 09 février 2016 à 20:15:41 par CHAT0N_BARBARE
CHAT0N_BARBARE CHAT0N_BARBARE
MP
Niveau 10
09 février 2016 à 20:32:52

Voici le code : https://www.noelshack.com/2016-06-1455046080-executeur-interface-code.png
La fenêtre menu s'ouvre: https://www.noelshack.com/2016-06-1455046093-executeur-interface-code2.png
Le fenêtre jeu s'ouvre: https://www.noelshack.com/2016-06-1455046105-executeur-interface-code3.png
Je ferme la fenêtre jeu, et relance le programme, la fenêtre menu s'ouvre: https://www.noelshack.com/2016-06-1455046116-executeur-interface-code4.png
La fenêtre regle s'ouvre: https://www.noelshack.com/2016-06-1455046128-executeur-interface-code5.png
La fenêtre regle ne se ferme pas et la fenêtre jeu ne s'ouvre pas: https://www.noelshack.com/2016-06-1455046140-executeur-interface-code6.png

_Rain _Rain
MP
Niveau 9
09 février 2016 à 20:57:22

Je t'invite à lire ceci, c'est une fonctionnalité spécial du python, pour modifier une variable qui est en dehors de ta méthode :

https://openclassrooms.com/courses/apprenez-a-programmer-en-python/portee-des-variables-et-references#/id/r-2232829

Utile pour modifier un objet qui n'est pas passé en paramétre ou pour modifier une variable de type valeur (nombre, char). Cependant il est extrêmement déconseillé de l'utiliser car elle rend les variables trop global justement tout le monde peut les modifier, ce qui n'est pas sécurisé. La meilleur chose à faire (si tu peux avec tkinter je ne sais plus) mettre ta variable regle en paramètre des fonctions qui la modifie.

_Rain _Rain
MP
Niveau 9
09 février 2016 à 21:18:35

Tiens c'est mieux que les global ça :
- http://effbot.org/zone/tkinter-callbacks.htm
- http://stackoverflow.com/questions/6920302/how-to-pass-arguments-to-a-button-command-in-tkinter
Après c'est un concept beaucoup plus poussé, donc si tu ne le comprend pas, utilise les globals, mais sache que tu ne devras plus le faire plus tard.

P.S: j'ai réussi à faire fonctionner ton programme avec ces deux méthode à toi de jouer. Aussi n'oublis pas quand tu à un objet None avant de lui faire un destroy(), vérifies qu'il n'est pas égale à None dans une condition.

CHAT0N_BARBARE CHAT0N_BARBARE
MP
Niveau 10
09 février 2016 à 21:40:03

Le 09 février 2016 à 21:18:35 _Rain a écrit :
Tiens c'est mieux que les global ça :
- http://effbot.org/zone/tkinter-callbacks.htm
- http://stackoverflow.com/questions/6920302/how-to-pass-arguments-to-a-button-command-in-tkinter
Après c'est un concept beaucoup plus poussé, donc si tu ne le comprend pas, utilise les globals, mais sache que tu ne devras plus le faire plus tard.

P.S: j'ai réussi à faire fonctionner ton programme avec ces deux méthode à toi de jouer. Aussi n'oublis pas quand tu à un objet None avant de lui faire un destroy(), vérifies qu'il n'est pas égale à None dans une condition.

Le 09 février 2016 à 21:18:35 _Rain a écrit :
Tiens c'est mieux que les global ça :
- http://effbot.org/zone/tkinter-callbacks.htm
- http://stackoverflow.com/questions/6920302/how-to-pass-arguments-to-a-button-command-in-tkinter
Après c'est un concept beaucoup plus poussé, donc si tu ne le comprend pas, utilise les globals, mais sache que tu ne devras plus le faire plus tard.

P.S: j'ai réussi à faire fonctionner ton programme avec ces deux méthode à toi de jouer. Aussi n'oublis pas quand tu à un objet None avant de lui faire un destroy(), vérifies qu'il n'est pas égale à None dans une condition.

je vais voir ça, merci :coeur:

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
La vidéo du moment