У меня есть текстовые файлы, в которых хранятся данные в зависимости от имени файла.Я сделал так, чтобы пользователи могли выбирать, какой текстовый файл они хотят искать, и в зависимости от того, какие они выбирают, данные для этого файла будут отображаться под правильным заголовком для этого файла.Проблема в том, что я не могу выровнять заголовки с данными из файла, поскольку данные могут различаться по размеру.
Я попытался поместить текстовый файл и разбить его построчно,и затем создание метки для каждой отображаемой строки, но это никогда не будет совпадать с заголовками, потому что информация внутри метки может быть буквально любого размера.Чтобы попытаться исправить это, я попытался разделить каждую строку на отдельные элементы, чтобы создать метку для каждого элемента, но не смог заставить это работать.
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()
Я ожидаю, что это будет выглядеть как:
Идентификатор Имя Фамилия PhoneNum ...
000 Джейкоб Петерсон 07793 ...
Однако вместо этого он читается как:
Идентификатор Имя Фамилия PhoneNum ...
000, Джейкоб, Петерсон, 077943 ...
Так что это заметно смещено (я не смог отформатировать это, как ожидалось, но первый пример должен быть выровнен).
Копировать комментарий :
Мне не разрешено использовать CSV.