如何从文本小部件单独检索行

2024-10-06 15:27:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在一个文本小部件中分别检索每一个新行,我有3个容器类的实例,第一个实例按预期打印数据,但第二个实例返回第一行的副本

我正在使用对象.获取('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()

Tags: 实例textselfaddtaskcontainerdefcurrent
3条回答

figbeam的答案是可行的,但是如果你输入了大量的文本,而且似乎你想单独阅读每一行,那就不太好了。在我看来,有一个更好的解决方案:

根据the docscurrent似乎没有达到您所期望的效果;也就是说,current将给您提供最接近鼠标的字符(并且只有当您实际移动鼠标时)。这可能是您注意到下面的小部件而不是顶部的小部件的奇怪行为的原因。在

更好的解决方案是移到文本的末尾,然后上移一行,然后使用前面的linestart和{}选择器。即改变

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

^{pr2}$

在这一变化之后,事情应该会像预期的那样工作!在

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?

有必要分开读每一行吗?否则,您可以将这些行读入一个列表中,然后分别处理列表项。在

据我所知,行的分隔符是newline,如果使用wrap,这会使它看起来很奇怪。在

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

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

只是一个想法。在

相关问题 更多 >