2
votes

Comment récupérer individuellement les lignes du widget texte

J'essaie de récupérer chaque nouvelle ligne dans un widget texte séparément, j'ai 3 instances de la classe Container , la première instance imprime les données comme prévu mais pour la seconde instance des doublons de la première ligne sont renvoyés J'utilise object.get ('current linestart', 'current lineend') pour renvoyer les nouvelles lignes séparément

code complet: https://pastebin.com/mLR3zbFg

class Container(tk.Frame):
    def __init__(self, parent = None, priority = 3, bg = 'bisque'):
        self.inpList = []
        self.b = tk.Button(self.f, text = 'add', command = lambda: self.add_task(priority))
    def add_task(self, priority): # refer 1.2_text for implementation
        finished = False
        self.t = tk.Text(self.f)
        self.t.configure(height = 10, wrap = 'word')
        self.t.bind("<Return>", self.save_task)
        self.t.pack(fill = tk.X)


def print_all(self):
    print(self.inpList)

def save_task(self, event):
    td = self.t.get('current linestart', 'current lineend')
    self.inpList.append(td)

if __name__ == '__main__':
    window = tk.Tk()
    window.minsize(300, 600)

    p1 = Container(window, priority = 1)
    p2 = Container(window, bg = 'blue', priority = 2)
    p3 = Container(window, bg = 'red', priority = 3)

    window.mainloop()


0 commentaires

3 Réponses :


1
votes

Est-il nécessaire de lire chaque ligne séparément? Sinon, vous pourriez lire les lignes dans une liste et travailler avec les éléments de la liste séparément.

Autant que je sache, le délimiteur pour les lignes est une nouvelle ligne, ce qui peut le rendre étrange si vous utilisez wrap.

Voici un exemple de lecture de plusieurs lignes dans une liste:

line_list = textbox.get('1.0', 'end').split('\n')
for line in line_list:
    # Process line

Juste une pensée.


1 commentaires

Avec 'end' une chaîne vide était enregistrée comme dernier élément de la liste, l'utilisation de 'end - 1c' a résolu ce problème. merci pour la suggestion, de toute façon les lignes sont stockées individuellement sous forme de listes, donc après 3 lignes, cela devient [['fizz'], ['fizz', 'buzz'], ['fizz', 'buzz', 'fizzzzz']]



2
votes

La réponse de figbeam pourrait fonctionner, mais ce ne serait pas génial si vous aviez beaucoup de texte saisi et il semble que vous vouliez lire chaque ligne individuellement. Voici une meilleure solution à mon avis:

Selon la documentation , en cours ne semble pas faire ce que vous attendez; à savoir, courant vous donnera le caractère le plus proche de votre souris (et seulement si vous déplacez réellement votre souris). Cela pourrait être une raison pour laquelle vous avez remarqué un comportement étrange pour les widgets qui se trouvaient ci-dessous mais pas celui du haut.

Une meilleure solution consiste à aller à la fin du texte, puis à monter d'une ligne, et puis utilisez les sélecteurs linestart et lineend que vous aviez auparavant. À savoir, changez

td = self.t.get('end - 1 lines linestart', 'end - 1 lines lineend')

en

td = self.t.get('current linestart', 'current lineend')

Les choses devraient fonctionner comme prévu après ce changement!


1 commentaires

Cela a fonctionné exactement comme je le voulais, chaque ligne a été ajoutée à la liste séparément. Merci pour la solution.



0
votes

La ligne td = self.t.get ('current linestart', 'current lineend') ne fonctionne pas comme prévu. Une solution consiste à lire l'intégralité du contenu de la zone de texte à chaque mise à jour (comme suggéré également dans https://stackoverflow.com/a/ 55739714/2314737 ).

Dans le code, remplacez la fonction save_task () par:

def save_task(self, event):
    td = self.t.get("1.0",'end').rstrip()
    self.inpList = td.split('\n')

Cela prend également en charge toutes les lignes supprimées qui resteront autrement dans td.

Voir aussi cette question similaire: Comment lire l'entrée (ligne par ligne) d'une Textbox Tkinter multiligne en Python?


0 commentaires