Je trouve pas le problème

Lion80fr -  
tomsawyer1311 Messages postés 375 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour , lors-ce que je tape mon programme , ca me met :

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Lion8\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "C:/Users/Lion8/Desktop/python/clicker_test.py", line 6, in addclick
c += 1
UnboundLocalError: local variable 'c' referenced before assignment

j'ai beau chercher sur plusieurs site , je ne trouve pas comment faire

le script:
from tkinter import *

c = 0

def addclick():
c += 1

Clicker = Tk()
Clicker.geometry("250x100")

ClickNb = Label(Clicker, text = c)
Click1 = Button(Clicker, text="click me", command=addclick).place(x='0',y='0')

ClickNb.pack()
Clicker.mainloop()

3 réponses

Utilisateur anonyme
 
Bonjour
En python il y a un truc fondamental : l’indentation.

En postant ton code, le site par défaut supprime tous les espacement qu’il considère « inutile ».
Pour palier à ça, CCM, comme tous les forums de codeurs dignes de ce nom, dispose de balises de code, voir ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

On commencera à se pencher sur ton problème quand ton code sera lisible.

Bonne journée

0
Lion80fr Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour, désoler , je ne savais pas que c'étais possible de faire sa.
Voici le script:
from tkinter import *

c = 0

def addclick():
    c += 1

Clicker = Tk()
Clicker.geometry("250x100")

Click1 = Button(Clicker, text="add click", command=addclick).place(x='30',y='0')
ClickNb = Label(Clicker, text= c ).place(x='0',y='0')

ClickNb.pack()
Clicker.mainloop()


et voici l'erreur :
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Lion8\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Users\Lion8\Desktop\python\clicker_test.py", line 6, in addclick
    c += 1
UnboundLocalError: local variable 'c' referenced before assignment


Si besoin d'autre information
0
tomsawyer1311 Messages postés 375 Date d'inscription   Statut Membre Dernière intervention   24
 
Bonjour,
Dans ton code :
ligne 3 : tu affectes l'entier 0 à la variable c. c est une variable du main (l'endroit par défaut du code python).
ligne 5 : en définissant une fonction, on quitte le main pour aller dans la fonction. En gros, j'ai une PS4 chez moi (main), toi, tu n'en as pas (la fonction), tu peux pas jouer. Tu dois me demander la PS4. En python, pour ce faire, il y a la méthode sale, au lieu d'écrire :
def addclick():
    c += 1

Tu écris :
def addclick():
    global c
    c += 1

Mais, avec tkinter, il est préférable d'utiliser ses types. 0 est un entier, tu peux faire ceci :
import tkinter as tk # C'est sale le from tkinter import *

def addclick():
    c_var.set(c_var.get() + 1)

Clicker = tk.Tk() # il le faut pour "activer" tkinter et utiliser ses propres types

c_var = tk.IntVar() # équivaut à c (de type entier) de ta ligne 3
c_var.set(0) # équivaut à c = 0 de ta ligne 3

Click1 = tk.Button(Clicker, text="add click", command=addclick) # c'est mieux de séparer
# la construction du bouton de sa mise en place (et place n'est pas une bonne idée)

Click1.place(x='30',y='0')

ClickNb = tk.Label(Clicker, textvariable= c_var)

ClickNb.place(x='30',y='0')

Clicker.mainloop()


Que fait la ligne 4 de mon code ?

1) elle récupère la valeur de c_var grâce à c_var.get() : au début 0.
2) elle ajoute 1 : 0 + 1 = 1.
3) elle affecte cette nouvelle valeur 1 grâce à c_var.set(ici).
Au prochain clic :
1) vaut 1
2) ajoute 1 donc : 2
3) vaut 2
et ainsi de suite.

Tu peux virer la ligne 14, de ton code, qui ne sert à rien. Sans cette ligne, ce n'est pas mieux, l'idée de place est pas terrible, les bouton et label se chevauchent, ça manque de clarté et de lisibilité.
Sur quel cours tu apprends ? Lis le mieux ou changes-en si c'est le cours qui te fait coder comme ça. Je te le dis honnêtement, ton code est horrible, aucun respect des conventions comme : les variables en minuscules, ainsi que les instances, usage de l'étoile pour l'import d'un module, préférer créer un alias (un raccourci comme j'ai fait en écrivant tk).
0
Lion80fr Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour , merci sa ma beaucoup aider , je ferais attention la prochaine fois .

sinon pour les cours , j'apprend tout seul en regardant sur des vidéos ou des sites , et sa fait a peine 1 semaine que j'ai vraiment commencer le python.
0
tomsawyer1311 Messages postés 375 Date d'inscription   Statut Membre Dernière intervention   24
 
D’accord,
Je te suggère d’apprendre davantage sur des cours textuels à jour donc pas de Python 2. Les cours vidéos, je les utiliserais pour me poser si j’en avais marre de lire mais s’il y a des erreurs, elles ne sont pas corrigées une fois le montage de la vidéo fait.
Suis plutôt le cours de Swinnen. Tu tapes « Apprendre python3 pdf Swinnen » si tu ne le fais pas déjà.
Et faire du tkinter après seulement 1 semaine de Python, c’est couillu comme dirait notre Président de la République actuel.
Pour moi, tu grilles des étapes.
0