Partage
  • Partager sur Facebook
  • Partager sur Twitter

Petite question avec tkinter

15 novembre 2017 à 10:11:33

Bonjour ou bonsoir, 

Ci-dessous vous trouverez ci-joint un petit code d'un menu définissant une difficulté sur un jeu. J'aimerais pouvoir continuer à choisir la difficulté tout en fermant le menu. Malheureusement, j'ai beau chercher je n'ai pas réussi à trouver une commande pour pouvoir faire un "Mafenetre.detroy" mais je ne désespère pas :) . Merci de vos réponses :) ,

Cordialement

Hervé.

# fonctions des difficultes
def facile():
    global difficulte
    difficulte=6
def moyen():
    global difficulte
    difficulte=5
def difficile():
    global difficulte
    difficulte=4
# Creation d'un widget Label (texte 'Choisissez votre difficultee !')
Label1 = Label(Mafenetre, text = 'Choisissez votre difficultee !', fg = 'brown')
# Positionnement du widget avec la methode pack()
Label1.pack()



# Creation d'un widget Button (bouton choix de difficulte)
Bouton1 = Button(Mafenetre, text = 'Facile', command = facile, fg = 'green')
Bouton1.pack()
Bouton2 = Button(Mafenetre, text = 'Moyen', command = moyen, fg = 'orange')
Bouton2.pack()
Bouton3 = Button(Mafenetre, text = 'Difficile', command = difficile, fg = 'red')
Bouton3.pack()
Bouton4 = Button(Mafenetre, text = 'Valider', fg = 'blue')
Bouton4.pack()

-
Edité par AngelineLaforp 15 novembre 2017 à 10:13:40

  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2017 à 23:54:51

Salut,

En fait, à la place de mettre tous les widgets, dans la même fenêtre, suffirait de créer deux fenêtres..

Il y aurait:

  • Une fenêtre principale, pour tout le jeu
  • Une fenêtre secondaire, pour le menu
Il existe tk.Toplevel(), qui permet de créer des fenêtres secondaires, sans le .mainloop()
import tkinter as tk

## Création de la fenêtre principale
fenetre_principale = tk.Tk()

## Création de la fenêtre secondaire
fenetre_secondaire = tk.Toplevel()

## UNE SEULE MAINLOOP (PRINCIPALE)
fenetre_principale.mainloop()
Exemple simple, avec quelque parties de votre code.
import tkinter as tk

## Création de la fenêtre principale
fenetre_principale = tk.Tk()


## Création de la fenêtre secondaire
fenetre_secondaire = tk.Toplevel()

## Vos widgets, pour la fenêtre secondaire..
Label1 = Label(fenetre_secondaire, text = 'Choisissez votre difficultee !', fg = 'brown')

def facile():
    global difficulte
    difficulte = 6
def valider():
    fenetre_secondaire.destroy()

# Creation d'un widget Button (bouton choix de difficulte)
Bouton1 = Button(fenetre_secondaire, text = 'Facile', command = facile, fg = 'green')
Bouton1.pack()

Bouton4 = Button(fenetre_secondaire, text = 'Valider', command=valider, fg = 'blue')
Bouton4.pack()


fenetre_principale.mainloop()

Comme vous le voyez, les fenêtres secondaires peuvent être détruites, sans arrêter la boucle principale (mainloop())

J'ai pas mis beaucoup d'explication, à cause des liens externes, donc si vous avez des questions, n'hésitez pas.
Bonne chance

A+

  • Partager sur Facebook
  • Partager sur Twitter
16 novembre 2017 à 11:00:01

Je viens de tester le code pour essayer de le comprendre. Cependant, (je ne sais pas si c'est voulu mais) j'ai constaté que cela ouvre trois fenêtre au lieu d'une seule. Es ce que cela est normal comme on appelle un fenêtre "secondaire" ou es ce une erreur ? De plus, les boutons de la fenêtres ne change toujours pas la difficulté. J'admet également ne pas comprendre le Toplevel et aimerais savoir si il y a un moyen de le contourner via des fonctions ou autres chose du genre ? Merci pour vos conseils et du que vous accorder à une random comme moi ^^. 

Bien à vous, 

Angeline. 

  • Partager sur Facebook
  • Partager sur Twitter
21 novembre 2017 à 21:33:44

Salut,

Tout d'abord, désolé, pour l'attente, je croyais avoir répondu.

Ensuite, Oups, je crois que j'ai mal compris votre problème. Désolé :'(.

Ce que je comprends pas est:  Qu'es-ce que votre menu? Un frame? Une fenêtre secondaire?

Pour détruire complètement une fenêtre, il faut .destroy(), mais si la fenêtre est la principale ( Tk() ), alors tout le programme arrêtera.

Pour pouvoir détruire un widget, sans fermer le programme, il faut simplement oublier l'emplacement du widget, avec .pack_forget() ou .grid_forget() (Dépend de ce que vous avez utilisé pour le placer)

Ce qui fera disparaître le widget, sans le détruire. Ensuite, pour le remettre (lorsque vous re-choisissez une difficulté), suffit de replacer le widget, avec .pack() ou .grid(). (Pas besoin de recréer le widget : Ex: Label(...))

Dans mon exemple du haut, je croyais que vous vouliez une nouvelle fenêtre (fenêtre secondaire), pour affichez le menu et la détruire, lorsque vous cliquez sur 'valider'.

En résumé, je crois que votre bout de code, n'est pas complet pour le problème que vous décrivez.

  • Où est le menu? (Qu'es-ce que le menu)
  • Es-ce que la variable MaFenetre est votre fenêtre principale? Tk()
  • Es-ce que la variable MaFenetre est une fenêtre secondaire ? Toplevel()
  • Es-ce que la variable MaFenetre est un frame?
  • Lorsque vous appuyez sur 'valider', quel comportement (action) devrait avoir le widget? Qu'es-ce qui disparaît?

Que voulez-vous dire par: Vous avez pas réussit à faire un MaFenetre.destroy() ?

Bonne chance

A+

  • Partager sur Facebook
  • Partager sur Twitter