我试图单独检索文本小部件中的每个新行,我有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()
figbeam的答案可能会有效,但如果您输入了大量文本并且您希望单独阅读每一行,那就不会很好。在我看来,这是一个更好的解决方案:
据the docs说,current
似乎并不像你期望的那样;也就是说,current会给你最接近鼠标的角色(只有当你真正移动你的鼠标时)。这可能是您注意到下面但不是顶部窗口小部件的奇怪行为的原因。
更好的解决方案是移动到文本的末尾,然后向上移动一行,然后使用之前的linestart
和lineend
选择器。即改变
td = self.t.get('current linestart', 'current lineend')
至
td = self.t.get('end - 1 lines linestart', 'end - 1 lines lineend')
在这次变化之后,事情应该按预期工作!
是否有必要分别阅读每一行?否则,您可以将行读入列表,然后单独使用列表项。
据我所知,行的分隔符是换行符,如果使用换行符,可能会使它看起来很奇怪。
以下是将多行读入列表的示例:
line_list = textbox.get('1.0', 'end').split('\n')
for line in line_list:
# Process line
只是一个想法。
线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?