Python-文本文件中的列表

Python-文本文件中的列表,python,tkinter,configparser,Python,Tkinter,Configparser,我正在努力从文本文件返回列表,并将新的用户输入值附加到列表中,而不同时附加现有值 我使用tkinter组合框中的列表,允许用户键入要添加到列表中的新值。我当前的代码使用一个简单的文本列表,查找现有值时,由于每行后面都有“\n”而导致问题。它正在查找键入/选定的值(在附加到列表之前,该值没有“\n”,而列表中除最后一行之外的所有值后面都有“\n”) listFile.txt是一个简单的文件:(它是各种各样的压缩文件) 项目1 项目2 项目3 我现有的代码是: from tkinter import

我正在努力从文本文件返回列表,并将新的用户输入值附加到列表中,而不同时附加现有值

我使用tkinter组合框中的列表,允许用户键入要添加到列表中的新值。我当前的代码使用一个简单的文本列表,查找现有值时,由于每行后面都有“\n”而导致问题。它正在查找键入/选定的值(在附加到列表之前,该值没有“\n”,而列表中除最后一行之外的所有值后面都有“\n”)

listFile.txt是一个简单的文件:(它是各种各样的压缩文件) 项目1 项目2 项目3

我现有的代码是:

from tkinter import *
from tkinter import ttk

listFile = open('listFile.txt','r')

root = Tk()
root.configure()
varItems = StringVar(root, value='')

class MainWindow(Frame):
    def __init__(self,master = None):
        Frame.__init__(self,master)
        self.master = master
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        """Create Window Layout"""
        self.label = Label(self, text="List Items").pack()
        self.itemCombo = ttk.Combobox(self, width = 16, textvariable = varItems)
        self.itemCombo.bind("<Return>", self.itemCombo_onEnter)
        self.itemCombo.bind('<<ComboboxSelected>>',self.itemCombo_onEnter)
        self.itemCombo['values'] = listFile.readlines()
        self.itemCombo.pack()

    def itemCombo_onEnter(self,event):
        varItems.set(varItems.get().lower().strip())
        mytext = varItems.get().strip()
        vals = self.itemCombo.cget('values')
        self.itemCombo.select_range(0,END)
        print(mytext)
        if not vals:
            self.itemCombo.configure(values = (mytext,))
        elif mytext not in vals:
            with open('listFile.txt','a') as f:
                f.write('\n'+ mytext)
                self.itemCombo.configure(values = vals + (mytext,))
                f.close
        return 'break'

app = MainWindow(root)
root.mainloop()
从tkinter导入*
从tkinter导入ttk
listFile=open('listFile.txt','r')
root=Tk()
root.configure()
varItems=StringVar(根,值=“”)
类主窗口(框架):
def uuu init uuu(self,master=None):
帧。\uuuu初始化(自,主)
self.master=master
self.grid()
self.create_widgets()
def创建_小部件(自):
“”“创建窗口布局”“”
self.label=标签(self,text=“列表项”).pack()
self.itemCombo=ttk.Combobox(self,width=16,textvariable=varItems)
self.itemCombo.bind(“,self.itemCombo\u oneter)
self.itemCombo.bind(“”,self.itemCombo\u oneter)
self.itemCombo['values']=listFile.readlines()
self.itemCombo.pack()
def itemCombo_onEnter(自身、事件):
varItems.set(varItems.get().lower().strip())
mytext=varItems.get().strip()
VAL=self.itemCombo.cget('values')
self.itemCombo.select\u范围(0,结束)
打印(mytext)
如果不是VAL:
self.itemCombo.configure(值=(mytext,))
elif mytext不在VAL中:
以open('listFile.txt','a')作为f:
f、 写入('\n'+mytext)
self.itemCombo.configure(值=VAL+(mytext,))
f、 接近
返回“中断”
app=main窗口(根)
root.mainloop()

我愿意接受任何建议或改变-非常感谢任何帮助

在onEnter方法中,将写入代码更改为:

with open('listFile.txt', 'w') as f:
    self.itemCombo.configure(values=vals + (mytext,))
    f.write("\n".join(vals + (mytext,)))
    f.close()

init方法中,将
listFile.readlines()
更改为
[listFile.readlines()]中的l的l.strip()
在OneNet方法中,将写入代码更改为:

with open('listFile.txt', 'w') as f:
    self.itemCombo.configure(values=vals + (mytext,))
    f.write("\n".join(vals + (mytext,)))
    f.close()

init方法中,将
listFile.readlines()
更改为
[listFile.readlines()]中的l的l.strip()
另一个更简单的解决方案是,只需包含一个与文件中的搜索相匹配的串联输入版本

mytext = mytext + "\n"
        if not vals:
            self.itemCombo.configure(values = (mytext,))
        elif mytext not in vals:
            with open('listFile.txt','a') as f:
                f.write('\n'+ mytext)
                self.itemCombo.configure(values = vals + (mytext,))
                f.close

另一个更简单的解决方案是只包含一个连接版本的输入,以匹配文件中的搜索

mytext = mytext + "\n"
        if not vals:
            self.itemCombo.configure(values = (mytext,))
        elif mytext not in vals:
            with open('listFile.txt','a') as f:
                f.write('\n'+ mytext)
                self.itemCombo.configure(values = vals + (mytext,))
                f.close