如何将2d数组从文本文件拆分为单独的元素并将标题应用于它们

时间:2019-02-15 21:12:26

标签: python tkinter

我有一个文本文件,该文件根据文件名存储数据。我这样做了,因此用户可以选择他们要搜索的文本文件,并且根据他们选择的内容,该文件的数据将显示在该文件的正确标题下。问题在于,由于数据的大小可能会有所不同,因此我似乎无法使标题与文件中的数据保持一致。

我尝试放置文本文件并将其逐行分割,然后为要显示的每一行创建一个标签,但这永远不会与标题对齐,因为标签内的信息实际上可以是任何大小。为了尝试修复它,我尝试将每一行拆分为单独的元素,以为每个元素创建一个标签,但无法正常工作。

def searchPage():
    def clearWidgets(chosenFrame):
            for widget in chosenFrame.winfo_children():
                widget.destroy()
    def populateData(dataFrame,searchOptions):
        clearWidgets(dataFrame)
        rowCount = 0
        colCount = 0
        searchFileName = searchChoice.get()

        with open('{}.txt'.format(searchFileName)) as f:
            fileData = ([[item for item in line.strip().split()] for line in f])
            print(fileData)
            for row in fileData:
                rowCount+=1
                colCount=0
                for element in row:
                    print(element)
                    rowData = Label(dataFrame,text=element,font=('Courier',14),anchor='w')
                    rowData.grid(row=rowCount,column=colCount,padx=5)
                    colCount+=1
##            for index,array in enumerate(fileData):
##                rowCount +=1
##                print(array)
##                for index2,variable in enumerate(array):
##                    print(index2)
##                    rowData = Label(dataFrame,text=variable,anchor='w',fg='#CCCCCC',bg='#333333')
##                    rowData.grid(row=rowCount,column=index)              
        #for line in fileData:
        #    rowData = Label(dataFrame,text=line,font=('Courier',14),width=60,anchor='w')
        #    rowData.grid(row=rowCount,column=0,rowspan=6)


    def searches(searchOptions,dataFrame):


        clearWidgets(labelFrame)
        colCount = 0
        headingCount = 0
        labels={}

        for labelTxt in selections[searchChoice.get()]:
            labels[labelTxt] = Label(labelFrame,text=labelTxt,width=15,bg='#CCCCCC',fg='#333333')
            labels[labelTxt].grid(sticky=W,row=0,column=colCount,padx=15)
            colCount+=1
            headingCount+=1

    searchWindow = Tk()
    searchWindow.title('Search')
    searchWindow.configure(bg='#333333')

    frame = Frame(searchWindow)
    frame.configure(bg='#333333')
    frame.grid(row=0,column=0,padx=100,pady=20)

    labelFrame = Frame(searchWindow,bg='#333333')
    labelFrame.grid(row=1,column=0,sticky=W)

    canvFrame = Frame(searchWindow)
    canvFrame.grid(row=3,column=0,sticky=NSEW)
    canvFrame.columnconfigure(0,weight=1)

    scrollFrame = Frame(canvFrame)
    scrollFrame.grid(row=2,column=0,stick=NW)

    def onFrameConfigure(canvas):
        canvas.configure(scrollregion=canvas.bbox("all"))

    canvas = Canvas(scrollFrame)
    canvas.grid(row=0,column=0)


    dataFrame = Frame(canvas,bg='#333333')

    vsb = Scrollbar(scrollFrame,orient='vertical',command = canvas.yview)
    vsb.grid(row=0,column=1,sticky=NS)
    canvas.configure(yscrollcommand=vsb.set,bg='#333333')

    #canvas.pack(side='bottom', fill='both', expand=True)
    canvas.create_window((4,4),window=dataFrame,anchor='nw')
    #dataFrame.update_idletasks()
    dataFrame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))
    canvas.configure(width=1250,height=600)

    #button config
    s = ttk.Style()
    s.configure('my.TButton', font=('Courier', 18),height=4,width=10,fg='#333333',bg='#CCCCCC')

    #entry config
    e = ttk.Style()
    e.configure('my.TEntry', font=('Courier', 18),height=4,width=10,fg='#333333',bg='#CCCCCC')

    pageTitle = Label(frame,text='Search Database',font=("Courier",44),fg='#CCCCCC',bg='#333333')
    pageTitle.grid(row=0,column=0,padx=10,pady=6,columnspan=2)

    returnBtn = Button(frame,text='Back',bg='#CCCCCC',fg='#333333',command= lambda:[f() for f in
                                                                [searchWindow.destroy,ownermenu]])
    returnBtn.place(x=500,y=500)

    searchFor = Label(frame,text='Search for: ',font=("Courier",18),fg='#CCCCCC',bg='#333333')
    searchFor.grid(row=1,column=0,padx=20)
    bookingHeadings = ('ID','CustomerID','InstructorID','CourseID',
                        'AmountPaid','HoursUsed','HoursRemaining')
    courseHeadings = ('ID','Type','Cost')
    customerHeadings = ('ID','Forename','Surname','PhoneNum','Postcode',
                        'LicenseNum')
    instructorHeadings = ('ID','Forename','Surname','PhoneNum',
                          'Postcode','LicenseNum','Password')
    lessonHeadings = ('ID','BookingID','Time','Date')
    selections = {'Bookings': bookingHeadings, 'Course': courseHeadings,
                'Customer': customerHeadings, 'Instructors': instructorHeadings,
                'Lessons': lessonHeadings}

    searchChoice = StringVar()
    searchOptions = ttk.Combobox(frame,values=list(selections.keys()),textvariable=searchChoice)
    searchOptions.grid(row=1,column=1)

    searchOptions.bind("<<ComboboxSelected>>",lambda x:
                       [searches(dataFrame,searchOptions),
                        populateData(dataFrame,searchOptions)])
    #populateData(searchOptions,dataFrame)



    menubar = Menu(searchWindow)
    filemenu = Menu(menubar,tearoff=0)
    filemenu.add_command(label='Home',command=lambda:[f() for f in [searchWindow.destroy,home1]])
    filemenu.add_separator()
    filemenu.add_command(label='Exit',command=searchWindow.destroy)
    menubar.add_cascade(label='Page',menu=filemenu)

    searchWindow.config(menu=menubar)

    searchWindow.overrideredirect(True)
    searchWindow.geometry("{0}x{1}+0+0".format(searchWindow.winfo_screenwidth(), searchWindow.winfo_screenheight()))

    searchWindow.mainloop()
searchPage()

我希望它读为:

ID姓氏电话号码...

000雅各布·彼得森07793 ...

但是,它的读法是:

ID姓氏电话号码...

000,Jacob,Peterson,077943 ...

因此,它显然没有对齐(我无法按预期格式进行格式化,但第一个示例应对齐)。

  

复制评论

     

我不允许使用csv。

0 个答案:

没有答案
相关问题