Bonjour,
pour planter le décor, je suis débutant avec Python (3 mois), mon objectif principal est d'enregistrer les positions associées aux différentes balises (tags) d'un widget Text vers un fichier de sauvegarde pour pouvoir restituer le texte et ses balises par la suite (avec une préférence pour sqlite3 pour la sauvegarde).
Dans ce but, j'ai testé la méthode tag_names (pour récupérer les noms des balises) et la méthode tag_ranges (pour récupérer les positions des balises). Je rencontre une difficulté sérieuse avec la méthode tag_ranges car l'objet qu'elle retourne me paraît un peu bizarre : la doc nous dit qu'il s'agit d'une liste mais on trouve qu'il s'agit d'un tuple quand on vérifie avec la méthode type.
Pour enregistrer les données dans sqlite3, je dois certainement les encoder en string mais c'est là que ça coince, voici un exemple simple pour éviter de noyer le poisson :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 import tkinter as tk import json def Linked(tup): for tag in tup: widText.tag_config(tag, foreground="blue", underline=1) widText.tag_bind(tag, "<Enter>", lambda e: widText.config(cursor="hand2")) widText.tag_bind(tag, "<Leave>", lambda e: widText.config(cursor="")) def listerTags(): # rechercher les noms de tous les tags(= balises) dans le texte listTags = widText.tag_names() # Sans argument, on obtient la liste (ou plutôt le tuple) de tous les tags définis pour le widget Text appelant. # rechercher les zones du texte où chacun des tags est utilisé for strTag in listTags: if strTag != "sel": # j'élimine les infos pour le tag sel qui ne m'intéresse pas zones = widText.tag_ranges(strTag) print("pour la balise {}, il y a les intervalles : {}\n".format(strTag , zones)) #print("en JSON :\n" , json.dumps(zones), "\n") # décoché car erreur root = tk.Tk() root.title("tkinter.Text : méthodes tag_names et tag_ranges") root.geometry("600x500+300+200") widText = tk.Text(root, width=40) # attention car width se mesure en nb de caractères ! bt1 = tk.Button(root, text="infos Tags", command=listerTags) bt2 = tk.Button(root, text="Quitter", command=root.destroy) bt1.grid(row =1, column =1, padx =10) bt2.grid(row =2, column =1, padx =10) widText.grid(row =1, column =0, rowspan =2, padx =10, pady =5) widText.insert(tk.END, "balise 1\n", "tag1") for v in range(10): widText.insert(tk.END, "bla bla..... bla bla..... \n") widText.insert(tk.END, "balise 2\n", "tag2") for v in range(10): widText.insert(tk.END, "bla bla..... bla bla..... \n") Linked(("tag1", "tag2")) root.mainloop()
Résultat obtenu dans la console :
- pour la balise tag1, il y a les intervalles : (<string object: '1.0'>, <string object: '2.0'>)
- pour la balise tag2, il y a les intervalles : (<string object: '12.0'>, <string object: '13.0'>)
Question :
Les noms des balises apparaissent sans leur type(ce qui m'arrange) mais pourquoi les intervalles (=ranges) comportent des ajouts comme <string object: ? Je n'ai pas trouvé de méthode simple pour supprimer ces ajouts.
Si j'essaie d'encoder les intervalles de balise en JSON, j'obtiens le message suivant :
TypeError: Object of type Tcl_Obj is not JSON serializable
Il y a peut-être quelque-chose qui m'a échappé dans la doc mais je pense avoir bien cherché et testé.
Avez-vous des pistes pour m'aider?
Cordialement
Partager