Как извлечь строки из текстового виджета индивидуально - PullRequest
2 голосов
/ 18 апреля 2019

Я пытаюсь получить каждую новую строку в текстовом виджете отдельно, у меня есть 3 экземпляра класса Container , первый экземпляр печатает данные, как и ожидалось, но для второго экземпляра возвращаются дубликаты первой строки

Я использую object.get ('current linestart', 'current lineend'), чтобы возвращать новые строки отдельно

полный код: 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()

Ответы [ 3 ]

2 голосов
/ 18 апреля 2019

Ответ figbeam может сработать, но было бы неплохо, если бы у вас было много введенного текста, и кажется, что вы хотите прочитать каждую строку отдельно. Вот лучшее решение на мой взгляд:

Согласно документам , current, похоже, не выполняет то, что вы ожидаете; а именно, current даст вам персонаж, ближайший к вашей мыши (и только если вы на самом деле двигаете мышь). Это может быть причиной того, что вы заметили странное поведение для виджетов, которые были ниже, но не видны сверху.

Лучшее решение - перейти к концу текста, затем на одну строку вверх, а затем использовать селекторы linestart и lineend, которые у вас были ранее. А именно изменить

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

до

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

После этого изменения все должно работать как положено!

1 голос
/ 18 апреля 2019

Нужно ли читать каждую строку отдельно? В противном случае вы можете прочитать строки в список, а затем работать с элементами списка отдельно.

Насколько я могу судить, разделителем строк является символ новой строки, что может сделать его странным, если вы используете перенос.

Вот пример чтения нескольких строк в списке:

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

Просто мысль.

0 голосов
/ 18 апреля 2019

Строка td = self.t.get('current linestart', 'current lineend') не работает должным образом.Одним из решений является чтение всего содержимого текстового поля при каждом обновлении (как предлагается также в https://stackoverflow.com/a/55739714/2314737).

. В коде замените функцию save_task() на:

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

Thisтакже заботится о любых удаленных строках, которые в противном случае останутся в td.

См. также этот похожий вопрос: Как прочитать ввод (строка за строкой) из многострочного текстового поля Tkinter в Python?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...