Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/01/2019, à 12:31

Compte supprimé

[Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

Bonjour,
                                                              Veuillez commencer la lecture de ce post en #3

Je me suis fait un petit script qui se lance au démarrage de mon ordi pour me rappeler ma nouvelle résolution de l'année ... à savoir ne plus refumer ^^ (ça fait  3 mois que j'ai repris)
Bref , j'aimerai le modifier de façon que les mots du texte s'affichent en plusieurs couleurs différentes ...
Puis je faire ça , avec Label ? Si oui comment? ( je n'ai pas su trouver l'info et je ne suis pas encore familier avec Tkinter. )
Demande reformulée avec Test
Merci.

Voici le script :

#!/usr/bin/env python
# -*- coding: UTF8 -*-

import tkinter as tk
import time
from datetime import date

def affiche(annonce):
    """ Affiche un texte en mouvement de gauche à droite """
    # charge le texte annonce dans label
    label['text'] = annonce
    label['bg'] = "pink" # fond des caractères label
    annonce = annonce.split()
    
    if len(annonce) == 0:    #si tous les caractères sont affichés alors on recommence 
        time.sleep(0.3)
        joursrestant = tempsrestant(2019, 4, 7)   # Ceci est le jour j , à modifier selon les besoins
        affiche('  <-------------Bravo, '+str(tempseffectue)+'  jours se sont écoulés. Dans '+ str(joursrestant)+" jours, c'est la fête: champagne!!")
        
        return
        
    mot = annonce.pop(0) #enlève le 1er mot de la liste 
    mot = list(mot) #transforme le mot en liste 
    mot.pop(0) #enlève la 1ere lettre du mot
    mot = "".join(mot) #reforme le mot en str
    annonce.insert(0,mot)
    annonce = " ".join(annonce)
    root.after(300, affiche, annonce)
    
def tempsrestant(anneej,moisj,jourj):
    """ retourne le nombre de jours entre la date du jour et le jour j """

    #Quel jour sommes nous?
    datedujour = time.strftime('20%y %m %d' ,time.localtime())
    datedujour = datedujour.split()
    annee = int(datedujour[0])
    mois = int(datedujour[1])
    jour = int(datedujour[2])
    # calcul nombre de jours jusqu'au jour j
    datedebut = date(annee,mois,jour)
    datefin = date(anneej, moisj, jourj)
    nbrjours = datefin - datedebut
    return nbrjours.days

def tempseffectue(anneepremier, moispremier , jourpremier):
    """ retourne le nombre de jours entre le début du compte à rebour et le jour actuel """
    
    #Quel jour sommes nous?
    datedujour = time.strftime('20%y %m %d' ,time.localtime())
    datedujour = datedujour.split()
    anneeactu = int(datedujour[0])
    moisactu= int(datedujour[1])
    jouractu = int(datedujour[2])
    #calcul du nombre de jours écoulé
    datepremier = date(anneepremier,moispremier,jourpremier)
    dateactu = date(anneeactu,moisactu,jouractu)
    nbrjours = dateactu - datepremier
    return nbrjours.days
     
    
############# Debut du programme ##############
root = tk.Tk()
root.title('La vie est belle')
root['bg']='pink' 
label = tk.Label(root) # fond de la fenêtre 

label.config(font=("Helvetica", 100,'bold'))
root.geometry('1400x200+10+10')
label.grid()

joursrestant = tempsrestant(2019, 4, 9)   # Ceci est le jour j , à modifier selon les besoins
tempseffectue = tempseffectue(2019, 1 , 5) # Le 1er jour du compte à rebour 
# 1er affichage
affiche('  <-------------Bravo, '+str(tempseffectue)+'  jours se sont écoulés. Dans '+ str(joursrestant)+" jours, c'est la fête: champagne!!")
root.mainloop()

Dernière modification par Compte supprimé (Le 13/01/2019, à 10:33)

#2 Le 10/01/2019, à 13:37

Compte supprimé

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

...J'ai posté un peu vite , en continuant mes recherches , j'ai trouvé cette ressource en français qui dit tout sur tout wink http://tkinter.fdex.eu/doc/textw.html#Text et qui répond à ma question . A savoir qu'il faut utiliser le Widget Text pour obtenir l'effet recherché ... Je vais me pencher dessus .

#3 Le 10/01/2019, à 17:21

Compte supprimé

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

... j'arrive presque à obtenir ce que je souhaite avec le Widget Text . Mais là je bloque , faute d'exemple concernant ce qui m'intéresse  .
voici mon code :

import tkinter as tk
root = tk.Tk()
root.geometry('700x300+10+10')
text = tk.Text(root)
text.insert('1.0', 'Il est beau mon toutou')
text.grid()
text.tag_add("mot_il_est", "1.0","1.6")
text.tag_add("mot_beau","1.7","1.11")
text.tag_config("mot_il_est",  background="yellow", foreground="blue", font=("Helvetica", 50,'bold'))
text.tag_config("mot_beau", background="pink", foreground="white", font=("Helvetica", 100,'bold'))
root.mainloop()

Pourquoi 'toutou' s'affiche t'il ainsi ?

#4 Le 10/01/2019, à 17:40

kholo

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

salut,
je ne vois pas où est le problème...
si tu vires la mise en forme tout est comme "mon toutou"

tu crées deux config que tu appliques à un ensemble de lettres : de 0 à 6 puis de 7 à 11
mais rien pour le reste... donc pas de mise en forme pour la fin de ton texte !

j'ai joué avec ça ya pas longtemps, je vais voir si j'ai pas ça sous la main !

Hors ligne

#5 Le 10/01/2019, à 17:42

pingouinux

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

Bonjour,

pseudofab #3 a écrit :

Pourquoi 'toutou' s'affiche t'il ainsi ?

Tu n'as pas défini de tag pour mon toutou, donc il s'affiche sans fioritures.

Hors ligne

#6 Le 10/01/2019, à 17:57

kholo

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

ah bah oui, je savais bien que j'avais ça sous la main !
j'ai adapté pour que ça te serve cool
normalement c'est une fenêtre en toplevel !

#!/usr/bin/env python3
# -*- coding: UTF8 -*-

import tkinter as tk


TEXT_AIDE = """\n
lightsoff - est un jeu facile à jouer.
Quand on clic sur un carré, il s'éteint 
ainsi que les carrés au dessus, au dessous à droite et à gauche.

le but est d'éteindre toutes les cases.

NB : Vous avez un mode DEMO pour vous entraîner

Bon jeu ! 
"""
LA_VERSION = "0.012"

def ouvrir_aide():
    """ fenetre d'aide """
    popup_aide = tk.Tk()
    popup_aide.title("Aide")
    popup_aide.grab_set()
    popup_aide.transient(popup_aide.master)
    popup_aide.resizable(width=False, height=False)
    popup_aide.configure(bd=10)

    le_texte = tk.Text(popup_aide)
    le_texte.tag_configure('normal', font=('Verdana', 12))
    le_texte.tag_configure('big', font=('Verdana', 16, 'bold'))
    le_texte.insert(tk.END,'LightsOff - ' + LA_VERSION, 'big')
    le_texte.insert(tk.END, TEXT_AIDE, 'normal')
    le_texte.pack()
    tk.Button(popup_aide, text="Fermer", command=popup_aide.destroy).pack()
    popup_aide.mainloop()

ouvrir_aide()

Hors ligne

#7 Le 10/01/2019, à 17:59

Compte supprimé

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

Merci pour votre soutien ...
Cependant ,si je tag (comme ci dessous)mon toutou l'affichage reste le même . (le dernier u de toutou va à la ligne suivante) ....

import tkinter as tk
root = tk.Tk()
root.geometry('700x300+10+10')
text = tk.Text(root)
text.insert('1.0', 'Il est beau mon toutou')
text.grid()
text.tag_add("mot_il_est", "1.0","1.6")
text.tag_add("mot_beau","1.7","1.11")
text.tag_add("reste","1.12", "1.22")
text.tag_config("mot_il_est",  background="yellow", foreground="blue", font=("Helvetica", 50,'bold'))
text.tag_config("mot_beau", background="pink", foreground="white", font=("Helvetica", 100,'bold'))
text.tag_config("reste",  background="yellow", foreground="blue")
root.mainloop()
 

Dernière modification par Compte supprimé (Le 10/01/2019, à 17:59)

#8 Le 10/01/2019, à 18:05

pingouinux

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

pseudofab #7 a écrit :

l'affichage reste le même . (le dernier u de toutou va à la ligne suivante) ....

Chez moi, tout s'affiche bien avec les couleurs, mais sur une seule ligne.

Hors ligne

#9 Le 10/01/2019, à 18:05

Compte supprimé

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

Merci Kholo,
Je vais regarder les détails de ton code pour savoir ce qui me manque wink

#10 Le 10/01/2019, à 18:10

kholo

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

oui les sauts de lignes ne respectent pas les mots :
quand le widget n'a plus de place il te coupe le mot comme un sauvage...
en tout cas j'en suis là pour le moment !

Hors ligne

#11 Le 10/01/2019, à 18:14

Compte supprimé

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

pingouinux a écrit :
pseudofab #7 a écrit :

l'affichage reste le même . (le dernier u de toutou va à la ligne suivante) ....

Chez moi, tout s'affiche bien avec les couleurs, mais sur une seule ligne.

Alors là neutral

kholo a écrit :

oui les sauts de lignes ne respectent pas les mots :
quand le widget n'a plus de place il te coupe le mot comme un sauvage...

Pourtant , il y a de la place non?

#12 Le 10/01/2019, à 18:30

kholo

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

du coup je m'y suis remis... pour faire l'aide de mon mastermind...
j'ai 2 écrans 1024x768 et 1366x768 sur 2 PC différents
les 2 avec le script identique n'affichent pas le texte avec les même césures
par exemple, la phrase :
"Le Mastermind ou Master Mind est un jeu de société pour deux joueurs dont le but est de trouver un code."
donnera d'un côté :

Le Mastermind ou Master Mind est un jeu de société pour deux joueur
s dont le but est de trouver un code.

pas terrible le s tout seul !
de l'autre :

Le Mastermind ou Master Mind est un jeu de société pour deux joueurs dont l
e but est de trouver un code.

là c'est le qui est coupé en  2

Hors ligne

#13 Le 10/01/2019, à 18:45

Compte supprimé

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

Ce que je ne comprends pas c'est que dans le cas du script en #7, le retour à la ligne se fait bien avant la fin de la fenêtre ... J'ai forcément loupé un truc roll ...
@pinguinux; Tu confirmes ne pas avoir le dernier "u" de "toutou" sur la ligne du dessous ? ( il est tout petit...)
et quand est il pour toi kholo?

#14 Le 10/01/2019, à 19:05

kholo

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

pour le script #7 j'ai tout sur une seule ligne et mon toutou sur fond jaune... pas de soucis !
image ici
écran en 1366x768 !

Dernière modification par kholo (Le 10/01/2019, à 19:15)

Hors ligne

#15 Le 10/01/2019, à 19:17

Compte supprimé

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

Alors là , ça dépasse mon entendement neutral hmm  sad
Ci joint la photo de ce que j'obtiens comme affichage :
http://pix.toile-libre.org/upload/origi … 140201.png

#16 Le 10/01/2019, à 19:20

kholo

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

en fait, c'est pas complètement illogique...
la partie "touto" en haut est défini par la taille maxi du début de la phrase...
le u tout seul est bien jaune et, comme seul, à la taille de cette partie...
quid du découpage de ce "u"...

Hors ligne

#17 Le 10/01/2019, à 19:27

Compte supprimé

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

étrange j'ai la même d'écran que toi (1366x768)...
Bon je reprendrai ça demain , j'y verrai sûrement plus clair . Bonne soirée

#18 Le 10/01/2019, à 19:29

kholo

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

A voir :

du_texte = 'Il est beau mon toutou'
text = tk.Text(root, height=len(du_texte))
text.insert('1.0', du_texte)

wink

Hors ligne

#19 Le 10/01/2019, à 21:37

Compte supprimé

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

Bien vu mais non ... tongue

#20 Le 10/01/2019, à 22:18

pingouinux

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

J'ai fait des essais, en précisant la police du champ mon toutou.
,font=("Helvetica", 12,'bold') : le dernier u est sur la ligne du dessous
,font=("Helvetica", 11,'bold') : c'est bon

Il se peut que la police utilisée par défaut dépende des versions, ce qui expliquerait nos différences. J'utilise python3.5

Hors ligne

#21 Le 10/01/2019, à 23:00

Compte supprimé

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

J'utilise Python3.6 ... Ce qui pourrait effectivement expliquer nos différences d'affichages ...mais au delà de ça, pourquoi donc le dernier u est sur la ligne du dessous avec font=("Helvetica", 12,'bold') ?? C'est la réponse à cette question que je cherche .... wink

Dernière modification par Compte supprimé (Le 10/01/2019, à 23:01)

#22 Le 10/01/2019, à 23:21

pingouinux

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

pseudofab #21 a écrit :

mais au delà de ça, pourquoi donc le dernier u est sur la ligne du dessous avec font=("Helvetica", 12,'bold') ?? C'est la réponse à cette question que je cherche

Je dirais que les caractères sont trop larges et ne tiennent pas tous sur la ligne.

Hors ligne

#23 Le 10/01/2019, à 23:52

Compte supprimé

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

Pourtant l'affichage fait son retour à la ligne alors que la fenêtre root est surdimensionnée ... Elle devrait accueillir l'intégralité de la ligne , non?
En tout cas avec le widget Label , ce fut le cas ...
( ce sont  mes 1er pas avec Tkinter et il y a sûrement une évidence que mes yeux de débutant ne voient pas... Faut dire que le widget Text est assez touffu et j'ai du louper un truc )

Dernière modification par Compte supprimé (Le 11/01/2019, à 00:08)

#24 Le 11/01/2019, à 09:24

kholo

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

bon, je reprends
je suis en python 3.5.2
d'abord je suis parti sur le paramètre height mais c'est width (mais j'ai fais ça entre 2 trucs ...)
ici

la page a écrit :

width
The width of the widget in characters (not pixels!), measured according to the current font size.

si je remet des valeurs un peu plus "normales" en taille de texte

#!/usr/bin/env python3
# -*- coding: UTF8 -*-

import tkinter as tk
root = tk.Tk()
root.geometry('700x300+10+10')
du_texte = 'Il est beau mon toutou'
text = tk.Text(root, width=len(du_texte)-1)
text.insert('1.0', du_texte)
text.grid()
text.tag_add("mot_il_est", "1.0","1.6")
text.tag_add("mot_beau","1.7","1.11")
text.tag_add("reste","1.12", "1.22")
text.tag_config("mot_il_est",  background="yellow", foreground="blue", font=("Helvetica", 10,'bold'))
text.tag_config("mot_beau", background="pink", foreground="white", font=("Helvetica", 12,'bold'))
text.tag_config("reste",  background="yellow", foreground="blue")
root.mainloop()

j'ai bien le u qui saute ma ligne
en passant le second en 16 ou en 18, j'ai pas ce que j'escompte.
puisque width doit se baser sur la taille de mon texte mais comme on en a plusieurs ça doit être le premier qui est pris en compte...
bon, après vérification, non plus...
en cherchant pour le découpage de ligne par mot, le paramètre wrap=tk.WORD ne donne pas de résultat probant sur cet exemple

#!/usr/bin/env python3
# -*- coding: UTF8 -*-

import tkinter as tk
root = tk.Tk()
root.geometry('700x300+10+10')
du_texte = 'Il est beau mon toutou'
text = tk.Text(root)
text.config(wrap=tk.WORD)
text.insert('1.0', du_texte)
text.grid()
text.tag_add("mot_il_est", "1.0","1.6")
text.tag_add("mot_beau","1.7","1.11")
text.tag_add("reste","1.12", "1.22")
text.tag_config("mot_il_est",  background="yellow", foreground="blue", font=("Helvetica", 60,'bold'))
text.tag_config("mot_beau", background="pink", foreground="white", font=("Helvetica", 100,'bold'))
text.tag_config("reste",  background="yellow", foreground="blue")
root.mainloop()

Hors ligne

#25 Le 11/01/2019, à 09:50

Compte supprimé

Re : [Résolu]Tkinter Widget Test , retour à la ligne non désiré ...

... Je viens de vérifier sur mon ordi l'affichage du script #7 avec Python3.5.2 et le u se trouve toujours en dessous .
Bonjour la portabilité ! Je me demande bien comment un programmeur se démerde avec ça...