Как записать многострочный текстовый виджет в одну строку текстового файла? - PullRequest
0 голосов
/ 28 мая 2020

Я создал GUI, который использует текстовый файл в качестве базы данных. Каждая строка в текстовом файле - это запись. Каждый элемент в каждой строке разделяется знаком «|», как в следующей структуре: « ID | Заголовок | Счетчик | Ключевые слова | ДАННЫЕ | Последнее обновление ». Два из этих элементов (счетчик и данные) отображаются / добавляются / редактируются / через text widget из tkinter.

Текстовый виджет может иметь multiple lines, включая breaks, что должно быть разрешено в моя программа. Однако, в конце концов, мне нужно, чтобы каждая запись была в одной строке текстового файла, иначе, очевидно, последуют ошибки чтения файла. Например, у меня есть масштабная линейка, которая позволяет мне прокручивать все записи, что приводит к ошибке out of range, поскольку последняя добавленная строка в файле не содержит всех элементов в соответствии со структурой записи.

Мне интересно, можно ли удалить breaks текстового виджета при записи в файл и добавить их при повторном чтении файла. Я думал об использовании функций str.strip("\n") и str.replace(".", ".\n"), но это не работает.

Вот необходимая часть моего кода, ориентированная только на один текстовый виджет, например:

import tkinter as tk

data_var = tk.StringVar()

sfile = open(DATAFILE, "a+")
temp_data = datatext.get("1.0", "end-1c") #Get whole text from text widget
temp_data.strip("\n")
data_var.set(temp_data) #Save text into var

#ID|Title|Counter|Keywords|DATA|Last Update
writeline = ("\n" + str(dataID_var.get()) + "|" +
                                title_var.get() + "|" +
                                counter_var.get() + "|" +
                                keywords_var.get() + "|" +
                                data_var.get() + "|" +
                                lastupdate_var.get())

sfile.write(writeline) #Write data into file
sfile.close #Close file

Это код для чтения файла и отображения его в записи:

sfile = open(DATAFILE, "r")
lines = sfile.readlines()
sfile.close

dataentry = (scalebar.get())-1       #Get the entryID from scalebar
rawcontent = lines[dataentry]         #Get line from lines with request entryID
content = rawcontent.split("|")      #Split the input in pieces to use the following seperatly
content = content.replace(".", ".\n")

#ID|Title|Counter|Keywords|DATA|Last Update

#Set textvariable to content and update text widget
data_var.set(content[4])
datatext["state"]="normal"              #Make sure you can edit the Text widget
datatext.delete(1.0, "end")             #Clear text widget first
datatext.insert(tk.END, data_var.get()) #show new content in text widget

Почему это не работает? (Первая часть str.strip("\n") уже не работает, я видел вручную в текстовом файле) Как я могу заставить это работать? Могу ли я отказаться от использования enter-key в качестве временного решения?

Заранее спасибо.

...