problème avec Tkinter et la méthode bind

utiliser les paramètres de bind

a marqué ce sujet comme résolu.
from tkinter import *
import tkinter.font as tkFont
font = tkFont
from random import randrange
fen = Tk()
fen.focus_force()
fen.title("Main window")
fen.geometry("850x600")
fen.configure(bg='black')
global x,y
x='1111' # pour test
y='2222' # pour test

def afficheCarac(event):
    global x,y
    x = str(event.keysym)
    y = str(event.keycode)
    print("La touche frappée est la touche ", x)
    print("Et son code clavier est ", y )

print("La touche frappée est la touche ", x)
print("Et son code clavier est ", y )


# si j'écris cela, j'obtiens a la première execution
# dans la console Python

# La touche frappée est la touche  1111
# Et son code clavier est  2222

# Mais si je frappe une touche clavier, la console Phyton affiche
# les deux lignes print qui sont dans la fonction
# mais pas les deux print qui sont après la fonction.
# Exemple
# La touche frappée est la touche g)
# Et son code clavier est 42
# Ce qui est très correct et semble montrer que les variables x et y
# définies dans la fonction sont bien reconnues et affectées.

# et maintenant ce que je souhaite c'est de pouvoir utiliser ces
# deux variables x et y pour par exemple les afficher dans un label
# Mais si je définis deux labels tels ceux-ci,

# label1 = Label(fen, text="Caractère : " + x)
# label2 = Label(fen, text="Code touche : " + y)
# label1.place(x=10, y=10)
# label2.place(x=10, y=32)

# J'obtiens le message d'erreur

# TypeError: can only concatenate str (not "int") to str

fen.bind("<Key>", afficheCarac)
fen.mainloop()

Voilà où j’en suis et je ne m’en sort pas. Pour faire court, ma question se résumerait simplement en : comment utiliser les retours de la fonction bind de tkinter pour les loger dans des variables reconnues par le script Python ? Si vous le souhaitez je peux vous donner des précisions sur mon projet. Merci de m’avoir lu, ce qui est gentil de votre part, mais surtout pour vos solutions que je souhaite évidentes, pour moi ! :)

Salut,

Je pense que tu as quelques conceptions erronées sur comment le script fonctionne.

Tout d’abord, il faut comprendre que le script est exécuté une seule fois. Au cours de ce script, bind permet d’enregistrer afficheCarac comme fonction devant être appelée à chaque touche pressée. Ensuite, dans mainloop, un mécanisme interne de tkinter tourne en boucle et va détecter l’appui des touches et appeler la fonction afficheCarac au bon moment. Le code de la fonction afficheCarac sera exécuté à ces moments-là.

En particulier, ça signifie que les lignes où tu définis le texte du label ne sont exécutées qu’une seule fois. C’est donc normal avec ton code actuel que les labels ne changent pas. Si tu veux qu’ils soient modifiés en même temps que l’appui sur une touche, il faut que le texte du label soit mis à jour dans la fonction afficheCarac.

Ensuite, c’est un peu curieux, mais je n’ai pas le message d’erreur que tu dis avoir quand j’affiche les labels. Ça fonctionne parfaitement chez moi.

Un grand merci à Arius pour avoir corrigé ma bévue, et à AAbu pour sa réponse qui m’a fait comprendre mon erreur. Il faut toutefois savoir que je suis tout nouveau avec Python et que son fonctionnement interne reste pour moi encore fort mystérieux. J’ai donc corrigé mon script ainsi :

from tkinter import *
import tkinter.font as tkFont
font = tkFont
from random import randrange
fen = Tk()
fen.focus_force()
fen.title("Main window")
fen.geometry("850x600")
fen.configure(bg='black')


def afficheCarac(event):
    x , y = '',''
    x = str(event.keysym)
    y = str(event.keycode)
    maj_labels(x,y)

def  maj_labels(x,y):
    label1 = Label(fen, text="Caractère = " + x, fg='white', bg='black')
    label2 = Label(fen, text="Code touche = " + y, fg='white', bg='black')
    label1.place(x=10, y=10)
    label2.place(x=10, y=40)

fen.bind("<Key>", afficheCarac)
fen.mainloop()

et cà marche bien. (reste à formater le text quand la chaine à afficher est longue, mais c’est un détail)

Tu as débloqué le principal problème, mais j’en profite quand même pour relever quelques autres choses.

Par exemple, si tu presses , et une autre touche après, tu verras que tu as l’ancien texte qui dépasse. En fait, cela arrive parce que à chaque fois que tu appelles maj_labels, tu crées de nouveaux labels et les anciens ne sont pas supprimés, mais cachés derrière, et parfois ils dépassent.

Une meilleure technique serait de simplement mettre à jour le texte. Cela nécessite que les labels soient accessibles dans la fonction maj_labels d’une manière ou d’une autre.

Une petite maladresse : la ligne x , y = '','' ne sert à rien. Tu peux l’enlever et constater que ça marche pareil.

Je me permet de te corriger un peu. Je n’ai rien débloqué, c’est toi qui a fait tout le travail. Et je t’en remercie ainsi que pour tes conseils et remarques. Et je pense aussi que j’en aurais probablement grand besoin plus tard. Un grand merci donc et à bientôt.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte