Partage
  • Partager sur Facebook
  • Partager sur Twitter

Communication entre deux fênetres tkinter

Utilisation d'une Combobox

15 juillet 2021 à 13:58:19

Salut salut,

Je suis en prépa et je bosse pas mal mon tipe pour l'année prochaine (pour ceux qui connaissent un peu)

L'idée est de créer un projet ou de réaliser une expérience puis de la présenter devant un jury etc..

J'ai déjà fait ça cette année (les profs nous l'ont demandé) et avec un pote on a programmé une ia de jeu d'échecs qui fonctionne via l'agorithme minmax et l'élagage alpha-beta. On a créé un interface graphique pour y voir plus clair et en vrai ça rend plutôt bien

(un exemple)

Bref tout ça pour vous expliquer le problème auquel je suis confronté maintenant :

J'améliore petit à petit ce qu'on a fait, à commencer par l'interface graphique. J'ai ajouté des boutons sur le côté pour différents paramètres. Cependant, j'utilise une méthode qui n'est peut-être pas la plus efficace.

 

En fait le troisième bouton pour lire un partie crée une nouvelle fenêtre, qui propose toutes les parties enregistrées dans un fichier annexe.

Le problème est le suivant : quand on clique sur une partie dans le menu déroulant il n'arrive pas à utiliser la méthode get() sur la Combobox, je pense que c'est à cause du fait qu'elle se trouve dans une autre fenêtre.

Je vous mets des extraits du code

def mlire(event): #Se délenche après avoir cliquer sur le nom d'une des partie
    partie = cBox.get()
    print("Lancement de la partie : ", partie)


def mlecture(): #Se déclenche au moment de l'appui sur le bouton des lectures de parties
    win = Toplevel(tk)
    win.iconbitmap("logo.ico")
    label_parties = Label(win, text="Choix de la partie")
    label_parties.pack()
    liste_parties = []
    with open("saves.txt",'rt') as file:
        for ligne in file:
            liste_parties += [nom_ligne(ligne)]
    cBox = ttk.Combobox(win,values=liste_parties)
    cBox.current(0)
    cBox.bind("<<ComboboxSelected>>",mlire)
    cBox.pack()
    win.mainloop()

###Plus tard on retrouve ces quelques lignes

box2 = Frame(tk) #### Création d'un cadre pour un menu avec des boutons ronds plus esthétiques
b1 = Radiobutton(box2, variable = v, value = 0,text='Nouvelle partie',command=newg)
b2 = Radiobutton(box2, variable = v,value = 1,text='Résolution de problèmes',command=creation_puzz)
b3 = Radiobutton(box2, variable = v,value = 2,text='Lecture de parties',command=mlecture)

box2.pack(expand=YES,side=RIGHT)
b1.grid(row=0, column=0, sticky=W)
b2.grid(row=1, column=0, sticky=W)
b3.grid(row=2, column=0, sticky=W)


L'erreur est bien NameError: name 'cBox' is not defined


Quelqu'un saurait comment "contourner" ce problème pour que ce que je fasse marche quand même ?

Mercii d'avance !

-
Edité par LeMecSansNom 15 juillet 2021 à 14:02:36

  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2021 à 15:12:04

problème classique de portée: cBox n'est déclaré/initialisé que dans la fonction mlecture(); en dehors, cette variable n'existe pas
  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2021 à 15:13:27

Visiblement j'avais pu le comprendre, ma question n'est pas d'où vient le problème mais comment le régler :)
  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2021 à 15:35:07

En principe, tu devrais utiliser des classes pour tes fenêtres (un exemple simple ici https://www.pythontutorial.net/tkinter/tkinter-toplevel/ ; dans cet exemple, dans le __init__ de window, on aurait un self.cBox=ttk.ComboBox(...) et on y accède depuis open_window de App via window.cBox.get() (par exemple) puisque window est un objet de type TopLevel qui a un widget cBox)

On peut aussi déclarer que cBox est une variable globale (mais peu recommandé)

  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2021 à 18:43:26

LeMecSansNom a écrit:

Visiblement j'avais pu le comprendre, ma question n'est pas d'où vient le problème mais comment le régler :)


Vous pouvez récupérer le widget dans event.widget.

Une autre solution serait de déclarer le calback mlire comme fonction imbriquée dans mlecture (cBox sera alors accessible puisque dans l'espace de noms englobant).

Reste que çà ne règle pas le soucis du côté de la variable partie (si on suppose qu'elle sert ailleurs... )

-
Edité par mps 15 juillet 2021 à 18:43:56

  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2021 à 21:44:26

umfred a écrit:

En principe, tu devrais utiliser des classes pour tes fenêtres (un exemple simple ici https://www.pythontutorial.net/tkinter/tkinter-toplevel/ ; dans cet exemple, dans le __init__ de window, on aurait un self.cBox=ttk.ComboBox(...) et on y accède depuis open_window de App via window.cBox.get() (par exemple) puisque window est un objet de type TopLevel qui a un widget cBox)

On peut aussi déclarer que cBox est une variable globale (mais peu recommandé)


Problème résolu en annonçant cBox en tant que variable globale!

Si je voulais utiliser les classes il aurait fallu que je recommence tout le code ^^' 

  • Partager sur Facebook
  • Partager sur Twitter
16 juillet 2021 à 9:43:57

box2 = Frame(tk) #### Création d'un cadre pour un menu avec des boutons ronds plus esthétiques
b1 = Radiobutton(box2, variable = v, value = 0,text='Nouvelle partie',command=newg)
b2 = Radiobutton(box2, variable = v,value = 1,text='Résolution de problèmes',command=creation_puzz)
b3 = Radiobutton(box2, variable = v,value = 2,text='Lecture de parties',command=mlecture)
 
box2.pack(expand=YES,side=RIGHT)
b1.grid(row=0, column=0, sticky=W)
b2.grid(row=1, column=0, sticky=W)
b3.grid(row=2, column=0, sticky=W)

Si tu as 50 Radiobutton, tu fais comment ? Tu écris 50 variables ?

  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

24 novembre 2023 à 22:05:39

bonsoir a tous j ai un soucis avec mon programme. j ai une page  accueil qui est lié par plusieurs script a travers un bouton. mais lorsque je lance un interface et que je revient sur la page d accueil , la page d accueil se plante.. ce qui veut dire je n ai pas la possibilité de lancer plusieurs page simultanés. comment résoudre se problème?
  • Partager sur Facebook
  • Partager sur Twitter
24 novembre 2023 à 22:33:27

@obedphares Bonsoir, merci de ne pas squatter le sujet des autres pour une nouvelle question, créer votre propre sujet dans le respect des règles du forum, il nous faut la description de votre problème et le code que vous avez écrit inséré sur le forum à l'aide de l'outil d'intégration de code soit le bouton code </>

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Liens conseillés

Je ferme ici.

-
Edité par AbcAbc6 24 novembre 2023 à 22:34:00

  • Partager sur Facebook
  • Partager sur Twitter