Tkinter : Récuperer la valeur d'un radioButon dans une boucle for [Résolu]

-
Bonjour à vous,

J'ai un problème très simple que je n'arrive pas à résoudre malgré toutes mes tentatives.
Je veux juste récupérer la valeur des mes RadioButtons avec get(), sauf que cette valeur est soit vide soit nulle.
J'ai essayé avec des variables en Int et en String mais cela ne résout pas le problème. (J'ai déjà fais tous les forums mais aucune solution fonctionne ...)

Je vous prie de trouver ci-dessous le code correspondant :

please=tk.IntVar()

def Sheet(list_sheet):
       sheet_name=tk.Tk()
       whichsheet=tk.Label(sheet_name, text="Veuillez cocher la feuille sur laquelle vous souhaitez travailler.")
       whichsheet.pack()

       for i in range (len(list_sheet)):
              choix=tk.Radiobutton(sheet_name, text=list_sheet[i], variable=please, value=i, command=catch)
              choix.pack()

       confirm=tk.Button(sheet_name, text="Confirmer", command=sheet_name.destroy)
       confirm.pack()

       sheet_name.mainloop()

def catch():
        print (please.get())

Sheet(SheetNameList) 






Merci beaucoup pour vos réponses,
Bryan


Configuration: Windows / Firefox 68.0
Afficher la suite 

2 réponses

0
Merci
Bonjour,

Chez moi ton code plante, car tu as créés une var tkinter avant d'avoir créer la fenêtre.

Par ex. comme ça :

import tkinter as tk

def Sheet(list_sheet):
       whichsheet=tk.Label(sheet_name, text="Veuillez cocher la feuille sur laquelle vous souhaitez travailler.")
       whichsheet.pack()

       for i in range (len(list_sheet)):
              choix=tk.Radiobutton(sheet_name, text=list_sheet[i], variable=please, value=i, command=catch)
              choix.pack()

       confirm=tk.Button(sheet_name, text="Confirmer", command=sheet_name.destroy)
       confirm.pack()

       sheet_name.mainloop()

def catch():
        print (please.get())

sheet_name=tk.Tk()
SheetNameList = ('aaaa', 'bbbbb')
please=tk.IntVar()

Sheet(SheetNameList)


Cela fonctionne très bien.
A quelle étape ?
J'arrive pourtant bien à lancer le script sans aucune erreur.
Tu programmes avec une version future de python ?

La version python qui réordonne la déclaration des variables et fonctions ?
python42 ?

Trève de plaisanterie.
Dans ce code tu fais
sheet_name.mainloop()
avant d'avoir déclarer sheet_name, ce n'est pas flagrant à tes yeux ?
Je suis sous python 2 donc bon la version 42 n'est pas pour aujourd'hui.

Plus sérieusement dans le code que j'avais fournis au tout début je déclarais bien sheet_name avant sheet_name.mainloop() mais c'est toi qui m'a fais changer de place ma déclaration de sheet_name moi j'ai juste suivis tes conseils ...

Et comme tu as pu le constater avec SheetNameList = ('aaaa','bbbbb')
cela fonctionne très bien (cf ton exemple).
> Bryan -
Bon déjà python2, pourquoi commencer à développer une application en python2 alors que bientôt il ne sera plus maintenu ?

mais c'est toi qui m'a fais changer de place ma déclaration de sheet_name moi j'ai juste suivis tes conseils


Jamais je ne t'ai dit de placer la création de la fenêtre après avoir commencer à l'utiliser.
Et si tu en es encore à ne pas savoir comment organiser ton code, ça va être compliqué.
Et puis si je te disais d'aller te jeter dans un lac, tu le ferais ?

Un code doit se construire selon une chronologie logique des étapes successives à réaliser.
Et si je t'avais dit de déplacer la création de la fenêtre hors fonction, c'est parce que tu avais créé une var tkinter avant la création de la fenêtre, ce qui n'est pas possible sans que ça plante.

Maintenant, je ne vois pas pourquoi si tu as bien tes labels créés sans problèmes avec le text qui va bien, il n'y aurait pas leur value défini à i puisque bien incrémenté...

Soit tu ne dis pas tout, soit quelque chose t'échappe.
D'accord merci de ton aide. Je vais chercher par moi même la solution.
Commenter la réponse de khrug
0
Merci
Si quelqu'un à le même problème, ça doit être parce qu'une fenêtre n'est pas fermée (destroy) dans mon cas c'était celle que askopenfilename ouvrée.
Donc la fenemture de la fenêtre empêchait la var tkinter de fonctionner ?
J'aimerai bien comprendre.

Puis d'ailleurs pour éviter d'avoir 2 fenêtres principales, car, si elle n'est pas créée, tkinter en fera une automatiquement, c'est ce qu'il se passe lorsque tu utilises askopenfilename.

Il suffit d'appeler askopenfilename après avoir créé ta fenêtre.

import xlrd
import tkinter as tk
from tkinter.filedialog import askopenfilename

def Sheet(list_sheet):
    whichsheet=tk.Label(sheet_name, text="Veuillez cocher la feuille sur laquelle vous souhaitez travailler.")
    whichsheet.pack()
    for i in range (len(list_sheet)):
        choix=tk.Radiobutton(sheet_name, text=list_sheet[i], variable=please, value=i, command=catch)
        choix.pack()

def catch():
    print (please.get())

sheet_name=tk.Tk()

please=tk.IntVar()

name = askopenfilename() #Avoir le chemin d'acces du fichier
workbook = xlrd.open_workbook(name)
SheetNameList = workbook.sheet_names()
Sheet(SheetNameList)

confirm=tk.Button(sheet_name, text="Confirmer", command=sheet_name.destroy)
confirm.pack()

sheet_name.mainloop()
Commenter la réponse de Bryan