Je développe une application en Python 3.13 et j’utilise indifféremment PyCharm ou VSCode, mais avec les deux, j’ai le même problème. Le problème que je vais décrire ne se produit cependant pas lorsque le code tourne avec VSCode sous Windows 11.
Voici le code :
from tkinter import*
def B1():
print(« Parameters »)
fen = Tk()
can1.pack(side=‹ left ›,padx=10,pady=10)
Button(fen, text = ‹ Paramètres ›, command =B1).pack(side=« top », padx=10,pady=10)
fen.mainloop()
Lorsque on exécute ce code sur VSCode sous Windows 11, pas de problème : le bouton B1 s’active bien lors du « premier run ».
Lorsque ce même code est exécuté sur le Rasperry PI5, il ne fonctionne pas à la première fois, il faut refaire apparaître la fenêtre pour que le bouton fonctionne (que ce soit sous VSCode ou PyCharm). Tout se passe comme si mainloop() ne s’activait pas au premier run.
Ton formatage ne permet pas de détecter les erreurs correctement, repost ton code avec les balises pour le code.
VSCode et Python c’est différent, alors attention.
from tkinter import*
def B1():
print("Parameters")
fen = Tk()
can1.pack(side="left",padx=10,pady=10)
Button(fen, text ="Paramètres", command =B1).pack(side="top", padx=10,pady=10)
fen.mainloop()
Ceci serais ton code formaté corrctement; avec le " et les espace devant chaque ligne de la function. Mais je crois que j’ai mal interprété ton code, car voici ce que ChatGPT me retourne;
ChatGPT dit:
Problèmes dans ton code :
Tu appelles can1.pack(...) alors que can1 n’a jamais été défini.
Tu crées une nouvelle fenêtre Tk() dans la fonction B1() alors qu’il y a déjà une fenêtre principale. En Tkinter, il ne faut avoir qu’une seule instance de Tk() — sinon, le comportement est imprévisible.
mainloop() est appelé après la définition de la fonction mais avant toute création correcte de fenêtre principale.
Tu as oublié de créer ton bouton principal avant la boucle d’événements.
Version corrigée :
Voici une version fonctionnelle de ton code :
from tkinter import *
def B1():
print("Parameters")
fen = Tk()
fen.title("Exemple Tkinter")
# Création du canevas
can1 = Canvas(fen, width=200, height=200, bg="lightblue")
can1.pack(side="left", padx=10, pady=10)
# Création du bouton
Button(fen, text="Paramètres", command=B1).pack(side="top", padx=10, pady=10)
# Boucle principale
fen.mainloop()
Explication :
Tk() crée la fenêtre principale. Tu ne dois en avoir qu’une seule.
Canvas ou Button doivent être créés à partir de cette fenêtre (fen).
mainloop() doit être appelé une seule fois à la fin du script, pour démarrer l’interface graphique.
Souhaites-tu que le bouton ouvre une nouvelle fenêtre (« Paramètres ») quand on clique dessus ?
Si oui, je peux te montrer comment faire ça proprement avec Toplevel().
Tout d’abord, un grand merci pour ton retour.
Mais malheureusement, le code que tu proposes comme celui de ChapGPT se comporte exactement comme décrit dans mon énoncé. Je pense qu’il s’agit plus d’un problème d’environnement que de code. Mais lequel???
En effet, ces codes fonctionnent parfaitement sous Windows 11 (qui n’est pas l’environnement dans lequel je vais travailler).
Merci
J’ai utilisé ChatGPT pour essayer de comprendre un peu plus ton code, vu le problème de formatage. Mais sans les détails il ne peut pas répondre correctement au problème en lui-même.
Si tu as ou peux ajouter une console, crée toi des log pour définir chaque partie de ton script. C’est de cette manière que je procède quand je cherche a savoir si le code s’arrête et où, ou simplement si il s’exécute comme il ce doit.
Après, ton comportement d’application problématique, je ne suis pas sur de comprendre parfaitement. Tu as une fenêtre avec un bouton et celui si doit s’afficher. Mais cette fenêtre ne ce crée pas à cause d’un besoin de focus sur la fenêtre, ou en d’autre mot la fenêtre est vide, mais ce complète une fois sélectionné.
Si c’est le cas, le problème semble tourner autour du « besoin » de rafraichissement de l’application, j’ai quelques possibilité, mais il y a une que je crois fort possible; TKinter a besoin de plus de paramètres pour savoir comment se comporter.
VSCode et PyCharm ont surement une manière différente de traiter l’exécution de TKinter, ce qui cause cette différence de comportement sans consigne précise. Il faut regarder les paramètre sur le focus et/ou l’état de la fenêtre. Parfois le simple fait de compléter les paramètres comme les dimension, le titre, ou autres de ce genre, peut mener à un changement de comportement du module. (pas spécifique à TKinter, déja vu dans d’autres contextes)
Bref, faut faire des tests et vérifier si tu peux contrôler le comportement de Tkinter pour en prédire l’exactitude.
De nouveau, un grand merci pour ton retour et le temps que tu mets à essayer de résoudre mon problème.
J’ai fait un copié collé de l’exécution du code. Comme tu peux le voir, la fenêtre, le libellé et le bouton apparaissent comme demandé par le code. L’error code de retour est bien 0, donc pas de soucis. Le seul hic, c’est que l’activation du bouton (clic gauche de la souris sur le bouton) de déclenche pas l’action que ce bouton devrait faire. Ce comportement est le même que ce soit sous VSCode ou sous PyCharm.
Par contre, comme je le décrivais dans mon premier post, ce même script fonctionne parfaitement bien lorsque VScode (ou PyCharm) tourne sous Windows11.
Si tu possède un Raspberry PI 5, peut-être pourrais -tu essayer ce script (qui ne fait que 9 lignes de code) et voir ce que cela donne.
Un grand merci encore pour ton aide.
Phillppe