如何分别从文本小部件检索行

时间:2019-04-18 05:03:29

标签: python tkinter

我试图分别在文本小部件中检索每个新行,我有3个 Container 类的实例,第一个实例按预期方式打印数据,但对于第二个实例,则返回第一行的重复内容< / p>

我正在使用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 个答案:

答案 0 :(得分:2)

figbeam的答案可能有用,但是如果您输入了很多文本,并且似乎想要单独阅读每一行,那将不是一个很好的选择。我认为这是一个更好的解决方案:

根据the docscurrent似乎并没有达到您的期望;也就是说,电流会带您到最接近鼠标的字符(并且仅当您实际移动鼠标时)。这可能就是为什么您注意到下面的小部件而不是上面的小部件的奇怪行为的原因。

一个更好的解决方案是移至文本末尾,然后向上移动一行,然后使用之前使用的linestartlineend选择器。即改变

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

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

此更改后,一切应该可以正常工作!

答案 1 :(得分:1)

是否需要分别阅读每一行?否则,您可以将这些行读入列表,然后分别处理列表项。

据我所知,行的定界符是换行符,如果使用自动换行,这会使它看起来很奇怪。

下面是将多行读入列表的示例:

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

只是一个想法。

答案 2 :(得分:0)

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')

这还将处理所有删除的行,否则这些行将保留在td中。

另请参阅类似的问题:How to read the input(line by line) from a multiline Tkinter Textbox in Python?