limiter la saisie de lignes avec widget text ?
Question toute simple que je me pose.
j'ai fait un programme qui utilise la bibliothèque reportlab, le but
étant de créer un un document pdf.
Dans le programme l'utilisateur est amené à saisir du texte.
Je veux laisser la possibilité à l'utilisateur de rentrer 5 lignes de
texte de son choix.
5 lignes et pas 6 !
avec une ligne comprenant maxi 80 caractères.
Le widget text semble répondre à ces attentes:
from Tkinter import *
root=Tk()
txt=Text(root,width=80,height=5) # 80 caractères et 5 lignes
txt.pack()
root.mainloop()
Mais, il y a un petit problème, si l'utilisateur veut taper plus de 5
lignes, il le peut, rien ne l'en empèche.
D'ou ma question: Comment empécher la saisie d'une 6 eme ligne, d'une
7eme ligne .. ?
Si vous avez une petite idée?
P.S
La solution consistant à cliquer sur un bouton "ok" qui génèrerait un message d'erreur ne me satisfait pas:
Solution genre sauvegarder le texte puis par une petite procédure compter le nombre de lignes et si ce nbre de lignes est > à 5 j'affiche un message
d'erreur.
Mais ce n'est pas ce que je recherche, je veux un contrôle permanent
sans que l'utilisateur ai besoin de cliquer sur "ok".
Un contrôle qui empêche la saisie de la 6eme ligne au moment même ou
l'utilisateur fait son "retour chariot".
Un peu comme la fonction validate de Pmw.EntryField qui permet de
limiter l'entrée au moment même de la saisie.
P.s j'ai regardé chez Pmw , en particulier Pmw.ScrolledText et je n'ai
rien vu pouvant m'aider .
petite piste exploitant tes remarques mais pas la soluce tout de même
Exemple de soluce incomplète, on informe bien que l'on a dépassé le nbre maxi de lignes mais hélas l'utilisateur un peu neuneu peut tout de même dépasser le nbre maxi autorisé.
J'ai utilisé un thread qui me permet de savoir à quel moment on atteind les 15 lignes. Mais ça ne bloque pas la saisie,... hélas!!
si vous avez une idée..., je suis preneur
Pour la commodité j'ai limité la saisie à 15 lignes, la dernière ligne devant être "JDEF votre serviteur"
#!/usr/bin/env python
# -*- coding: cp1252 -*-
#Remarque codage en cp1252 sur python2.4 et sur linux python2.6 on est en utf-8
#
#Prog test par J.Def du widget text de Tkinter
#But : Informer l'utilisateur lorsqu'il dépasse le nbre maxi de lignes (ici 15)
#Méthode trouvé: utilisation d'un Thread
#
#PB Je l'informe dès qu'il a dépassé les 15 lignes saisies, mais hélas je ne l'empêche pas
#de saisir plus de 15 lignes!
#La question reste entière : comment bloquer la saisie au dela des 15 lignes ??
from Tkinter import *
import threading,time
def fct(): #appelé par le thread, dès que l'on a + de 15 lignes on met une alarme
global stop,f_alarm
while stop==0:
time.sleep(0.01)
start = 1.0
while 1: #je scrute la dernière ligne censée être la signature du document: JDEF votre serviteur
pos = txt.search("JDEF votre serviteur", start, stopindex=END)
if not pos:
break
nb_ligne=int(eval(pos))
print "le nbre de lignes est",nb_ligne
start = pos + "+1c"
if nb_ligne>15: #si supérieur à 15 lignes -> envoie l'alarme
stop=1 #stope le thread
f_alarm=Toplevel()
l=Label(f_alarm,text="vous ne devez pas dépasser 15 lignes").pack()
def quit():
global stop,root
stop=1
root.destroy()
#--------------- prog principal -------------------------
root=Tk()
root.geometry("%dx%d+%d+%d" % (300,300,0,0))
txt=Text(root,width=40,height=15)
txt.pack()
#mise en place de la signature de bas de page:
txt.insert(END, "\n\n\n\n\nJDEF votre serviteur")
button = Button(root, text="quit", command=quit).place(x=150,y=250)
#on lance le thread:
t = threading.Thread(target=fct)
stop=0
t.start()
félicitations à vous tous !
Je butais sans voir de solution.
Vous avez parfaitement répondu à mon pb.
L'idée du bind était bien la solution.
Merci à vous tous. Je savais bien qu'il y avait des programmeurs de grande classe sur ce site. :ccool:
jérôme
1 pièce(s) jointe(s)
Ma soluce au pb de limitation des lignes du widget text
Après m'être inspiré de vos remarques et soluces, je vous donne ma version d'un petit programme qui répond à mes attentes : voir le fichier joint
Si ça peut modestement aider quelqu'un confronté au même problème.
Encore merci pour toute votre aide :ccool:
ohtoulouse