voici mon code:
n = 0 perc = list() while n < len(piedata): perc.append(piedata[n+2]) n += 3 print (perc) n = 0 fails = list() while n < len(piedata): fails.append(piedata[n+1]) n += 3 print(fails) n = 0 titles = list() while n < len(piedata): titles.append(piedata[n]) n += 3 print(titles) counter = 0 while counter <= len(titles): currenttime = [perc[counter], fails[counter], titles[counter]] print(currenttime) for percent, fail, title in currenttime: piedata = [percent, (100-percent)] fig = matplotlib.figure.Figure(figsize=(5, 5)) ax = fig.add_subplot(111) ax.pie(piedata) # this is the information that the circle diagram will be made out of ax.legend([('amount of attempts:', NOTT), ('amount of fails', fail)]) circle = matplotlib.patches.Circle((0, 0), 0.7, color='white') ax.add_artist(circle) # this is the code for actually putting the circle diagram/pie chart on the screen canvas = FigureCanvasTkAgg(fig, master=window) canvas.get_tk_widget().pack() canvas.draw() Label(window, text=(title, title), bg='light blue').pack() counter += 1 window.mainloop() print(percent) print(fail)
Lorsque je l'exécute, j'obtiens une erreur de valeur indiquant
['67', '1', 'subsection']
Mais lorsque j'imprime heure actuelle , j'obtiens
ValueError: not enough values to unpack (expected 3, got 2)
Pour moi, cela ressemble à 3 valeurs, mais évidemment je me trompe, quelqu'un pourrait-il m'éclairer? J'ai regardé autour de moi, mais je n'ai trouvé aucune bonne réponse shofar. toute aide serait grandement appréciée. Merci
contexte de code:
while counter <= len(titles): currenttime = [perc[counter], fails[counter], titles[counter]] print(currenttime) for percent, fail, title in currenttime:
3 Réponses :
L'instruction:
for percent, fail, title in zip(perc, fails, titles): piedata = [percent, (100 - percent)] fig = matplotlib.figure.Figure(figsize=(5, 5)) ax = fig.add_subplot(111) ax.pie(piedata) # this is the information that the circle diagram will be made out of ax.legend([('amount of attempts:', NOTT), ('amount of fails', fail)]) circle = matplotlib.patches.Circle((0, 0), 0.7, color='white') ax.add_artist(circle) # this is the code for actually putting the circle diagram/pie chart on the screen canvas = FigureCanvasTkAgg(fig, master=window) canvas.get_tk_widget().pack() canvas.draw() Label(window, text=(title, title), bg='light blue').pack() window.mainloop() print(percent) print(fail)
signifie décompresser chaque élément de la liste currenttime
comme une séquence, et pourtant chaque élément du currenttime code > list est juste une chaîne, qui se décompresse en caractères, dont le premier élément n'a que deux, ce qui entraîne l'erreur "pas assez de valeurs pour décompresser (attendu 3, obtenu 2)".
Pour vos besoins , vous devez simplement compresser les 3 listes et parcourir le générateur zip
au lieu d'une boucle while
avec un compteur et une boucle interne for
:
for percent, fail, title in currenttime:
ah, merci beaucoup d'avoir expliqué le truc des cordes, je ne le savais pas. Malheureusement, il doit s'agir d'une liste de tuples, en raison de la nature du reste du code, connaissez-vous un moyen d'obtenir cela et d'avoir les valeurs telles qu'elles sont actuellement. EG: convertir chacun en un type différent ?.
également, ont ajouté le contexte du code au Q principal
Heureux d'avoir pu aider. Maintenant, je vois le contexte autour de votre code publié, cela réaffirme ma conviction que vous n'avez pas du tout besoin de currenttime
. Veuillez essayer la solution que j'ai fournie en utilisant zip
. Il remplace votre boucle while
, vous n'avez donc pas du tout besoin d'une boucle interne for
.
ne supposez pas que vous ayez une expérience avec matplotlib et tkinter? Je veux qu'il fasse 2 diagrammes circulaires, mais à partir de là, il n'en fait qu'un
Désolé mais malheureusement pas. Vous obtiendrez de bien meilleures réponses si vous la postez comme nouvelle question afin que les personnes possédant les bonnes connaissances soient plus en mesure de vous aider.
Les lignes suivantes:
currenttime = (perc[counter], fails[counter], titles[counter]) percent, fail, title = currenttime
implique que currenttime
est une liste de tuples, quand c'est une liste dans votre exemple, et qui se traduit par: p >
percent = currenttime[0] fail = currenttime[1] title = currenttime[2]
ce que vous devriez faire à la place si vous voulez obtenir les 3 éléments de currenttime
:
for (percent, fail, title) in currenttime:
ou faites de currenttime
un tuple:
for percent, fail, title in currenttime:
La source d'une commande for
doit être une itérable. Le vôtre est un itérable qui renvoie une chaîne à chaque itération. Le premier élément renvoie "67"
, qui n'a que deux éléments à décompresser.
Pour la fonctionnalité que vous souhaitez, chaque élément de currentime
devrait être un triple. Par exemple:
currenttime = [ ['67', '1', 'subsection'], ['18', '5', 'main branch'], ... ]
Dans ce cas, chaque itération donne trois valeurs à décompresser.
ah, je vois, thaankyou