[英]How to retrieve lines from text widget individually
我正在嘗試分別在文本小部件中檢索每一行,我有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的答案可能有用,但是如果您輸入了很多文本,並且似乎想要單獨閱讀每一行,那將不是很好。 我認為這是一個更好的解決方案:
根據文檔 , 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
。
另請參見類似的問題: 如何在Python中從多行Tkinter文本框中讀取輸入(逐行)?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.