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

Résolu
Bryan -  
 khrug -
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

2 réponses

khrug
 
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.
0
Bryan
 
Merci khrug pour ta réponse, mais la fonction catch me print toujours 0.
Est ce que tu arrives à récupérer 0 pour 'aaaa' et 1 pour 'bbbb' etc ?
0
khrug
 
Bonjour,

Oui, j'obtiens bien 0 pour "aaaa" et 1 pour "bbbb"

Hum, es-tu sûr d'exécuter le bon script ? Celui que tu modifies et pas un autre ?
Car, il est très étrange que tu n'aies pas eu de plantages avec le script que tu as posté.
0
Bryan
 
Effectivement le code que tu m'as fourni fonctionne. Enfaite ce qui est faux (ou incompatible) c'est lorsque je récupère le nom de mes feuilles dans la liste avec ces 3 commandes.

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

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

Aurais-tu une explication ?

Merci beaucoup pour tes réponses,
Bryan
0
khrug > Bryan
 
Non, je n'ai pas d'explications.

D'après la doc, sheet_names retourne une liste, l'as-tu affiché avec un print pour voir ce que ça contient ?
0
Bryan
 
Oui et c'est bien une liste itérable...
0
Bryan
 
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.
0
khrug
 
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()
0