我有一个基于 tkinter/ttk 和 openpyxl 的应用程序,可以收集学生信息并将其写入 Excel 工作簿。该应用程序的一半是 GUI 数据输入,另一半是显示 Excel 工作簿中数据的查看器。我想做的是填充另一个 Excel 工作簿中的组合框列表。目前,我在组合框中收到一条消息,其中提到当应用程序运行时 openpyxl,但不显示 Excel 工作簿中存储的数据。我希望从 Excel 中提取组合框,这样我就可以修改可用的选项,而无需每次在组合框中的列表中添加或删除选项时重新编译。
#modules
import tkinter as tk
from tkinter import ttk
from tkinter import*
import openpyxl
import os
from tkinter import messagebox
from openpyxl import load_workbook
def load_data():
#path = "C:\code\Student-Database-Portal-v3\StudentDatabase-1.xlsx"
path = '\\\\net-app\ils\Training\Databases\Student_Database\StudentDatabase-1.xlsx'
workbook = openpyxl.load_workbook(path)
sheet = workbook.active
list_values = list(sheet.values)
print(list_values)
for col_name in list_values[0]:
treeview.heading(col_name, text=col_name)
for value_tuple in list_values[1:]:
treeview.insert('', tk.END, values=value_tuple)
#Insert data to Excel File
def saved():
tk.messagebox.showinfo('Student Data Saved')
button.pack(side= 'center')
def insert_row():
#Column A
Last_Name = lname_entry.get()
#Column B
Middle_Name = mname_entry.get()
#Column C
First_Name = fname_entry.get()
#Column D
Nationality = nation_entry.get()
#Column E
Employer = emp_combobox.get()
#Column F
Course = course_combobox.get()
#Column G
Site = site_combobox.get()
#Column H
City = city_combobox.get()
#Column I
State_Province = sp_combobox.get()
#Column J
Country = country_combobox.get()
#Column K
Instructor = inst_combobox.get()
#Column L
Month = month_combobox.get()
#Column M
Year = year_combobox.get()
#Column N
Notes = notes_entry.get()
print(Last_Name, Middle_Name, First_Name, Nationality, Employer, Course, Site, City, State_Province, Country, Instructor, Month, Year, Notes
)
# Insert row into Excel sheet
#path = "C:\code\Student-Database-Portal-v3\StudentDatabase-1.xlsx"
path = '\\\\net-app\ils\Training\Databases\Student_Database\StudentDatabase-1.xlsx'
workbook = openpyxl.load_workbook(path)
sheet = workbook.active
row_values = [Last_Name, Middle_Name, First_Name, Nationality, Employer, Course, Site, City, State_Province, Country, Instructor, Month, Year, Notes]
sheet.append(row_values)
workbook.save(path)
# Insert row into treeview
treeview.insert('', tk.END, values = row_values)
#Clear Values
#Column A
lname_entry.delete(0,'end')
lname_entry.insert(0, ' ')
#Column B
mname_entry.delete(0, 'end')
mname_entry.insert(0,' ')
#Column C
fname_entry.delete(0, 'end')
fname_entry.insert(0, ' ')
#Column D
nation_entry.delete(0, 'end')
nation_entry.insert(0, ' ')
#emp_entry.delete(0, 'end')
#emp_entry.insert(0, 'Employer')
#Column E
emp_combobox.delete(0, 'end')
emp_combobox.insert(0, ' ')
#Column F
course_combobox.delete(0, 'end')
course_combobox.insert(0, ' ')
#Column G
#site_entry.delete(0, 'end')
#site_entry.insert(0,' ')
#Column H
city_entry.delete(0, 'end')
city_entry.insert(0, ' ')
#Column I
sp_entry.delete(0, 'end')
sp_entry.insert(0, ' ')
#Column J
country_combobox.delete(0, 'end')
country_combobox.insert(0, ' ')
#Column K
inst_combobox.delete(0, 'end')
inst_combobox.insert(0, ' ')
#Column L
month_combobox.delete(0, 'end')
month_combobox.insert(0, ' ')
#Column M
year_combobox.delete(0, 'end')
year_combobox.insert(0, ' ')
#Column N
notes_entry.delete(0, 'end')
notes_entry.insert(0, ' ')
#def toggle_mode():
# if mode_switch.instate(['selected']):
# style.theme_use('forest-dark')
#else:
# style.theme_use('forest-light')
root = tk.Tk()
#img = PhotoImage('C:\\code\\Student-Database-Portal-v3\\fsi_icon_simulator2.ico')
root.iconbitmap('C:\\code\\Student-Database-Portal-v3\\fsi_icon.ico')
style = ttk.Style(root)
style.theme_use('vista')
root.wm_attributes()
#style.configure(style = 'black.treeview')
#root.tk.call('source', 'C:\\Code\Student-Database-Portal\\forest-dark.tcl')
#root.tk.call('source', 'C:\\Code\Student-Database-Portal\\forest-light.tcl')
#style.theme_use('forest-dark')
root.title('FlightSafety Technical Training | Student Database Entry Portal')
frame = ttk.Frame(root)
frame.pack()
widgets_frame = ttk.LabelFrame(frame, text= 'Student Information')
widgets_frame.grid(row = 0, column = 0, pady = 10)
months = ['Month','January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
years = ['Year', '2020','2021' ,'2022', '2023', '2024','2025','2026','2027','2028','2029','2030']
instructor = ['Instructor','Drolet', 'Fleming', 'Nichols', 'Phares', 'Smith']
course = ['Course', 'Development', 'Hardware', 'New Tech', 'Computer Systems', 'Tech Refresh', 'Visual']
wb_dbdata = load_workbook(filename ='\\\\net-app\ils\Training\Databases\Student_Database\DBData.xlsx', read_only = True )
ws_employer = wb_dbdata['Employer']
emp_xlsx_range = ws_employer['A1':'A100']
ws_country = wb_dbdata['Country']
ws_cities = wb_dbdata['Cities']
ws_states = wb_dbdata['States']
employer = [ws_employer]
countries = []
centers = []
cities = []
states = []
for cell in emp_xlsx_range:
for x in cell:
y = x.value
employer.append[y]
#Directions
readme_label = tk.Label(widgets_frame, text = "Please enter requested information.")
readme_label.grid(row = 0, column = 0, padx =(5,10), pady = (5,10))
#Separator
button_separator = ttk.Separator(widgets_frame)
button_separator.grid(row = 1, column = 0, sticky = 'ew', padx =(20,10), pady = (20,10))
readme_label_ = tk.Label(widgets_frame, text = "If blank fill field type single")
readme_label_.grid(row = 2, column = 0, padx =(0,5), pady = (0,5))
_readme_label = tk.Label(widgets_frame, text = "'space bar' to avoid 'None'")
_readme_label.grid(row = 3, column = 0, padx =(0,5), pady = (0,5))
#Column A
lname_label = tk.Label(widgets_frame, text = 'Last Name: ')
lname_label.grid(row =4, column = 0,sticky = 'ew', padx = (10,10), pady = (0, 10))
lname_entry =ttk.Entry(widgets_frame)
lname_entry.insert(0,' ')
lname_entry.bind('<FocusIn>', lambda e: lname_entry.delete('Last Name', 'end'))
lname_entry.grid(row = 5, column = 0, sticky = 'ew', padx = (10,10), pady =(10,10))
#Column B
mname_label = tk.Label(widgets_frame, text = 'Middle Name (Optional) if none place _ : ')
mname_label.grid(row = 6, column = 0,sticky = 'ew', padx = (10,10), pady = (0, 10))
mname_entry =ttk.Entry(widgets_frame)
mname_entry.insert(0,' ')
mname_entry.bind('<FocusIn>', lambda e: mname_entry.delete('Middle Name', 'end'))
mname_entry.grid(row = 7, column = 0, sticky = 'ew', padx = (10,10), pady = (0, 10))
#Column C
fname_label = tk.Label(widgets_frame, text = 'First Name: ')
fname_label.grid(row = 8, column = 0,sticky = 'ew', padx = (10,10), pady = (0, 10))
fname_entry =ttk.Entry(widgets_frame)
fname_entry.insert(0,' ')
fname_entry.bind('<FocusIn>', lambda e: fname_entry.delete('Fisrt Name', 'end'))
fname_entry.grid(row = 9, column = 0, sticky = 'ew', padx = (10,10), pady = (0, 10))
#Column D
nation_label = tk.Label(widgets_frame, text = 'Nationality: ')
nation_label.grid(row = 10, column = 0,sticky = 'ew', padx = (10,10), pady = (0, 10))
nation_entry =ttk.Entry(widgets_frame)
nation_entry.insert(0,' ')
nation_entry.bind('<FocusIn>', lambda e: nation_entry.delete(' ', 'end'))
nation_entry.grid(row = 11, column = 0, sticky = 'ew', padx = (10,10), pady = (0, 10))
#Column E
emp_label = tk.Label(widgets_frame, text = 'Type in if not listed: ')
emp_label.grid(row = 12, column = 0,sticky = 'ew', padx = (10,10), pady = (0, 10))
emp_combobox = ttk.Combobox(widgets_frame, values = employer)
emp_combobox.current
emp_combobox.grid(row = 13, column = 0, sticky = 'ew', padx = (10,10), pady = (0, 10))
emp_combobox.set('Employer')
#Column F
course_label = tk.Label(widgets_frame, text = 'Course: ')
course_label.grid(row = 14, column = 0,sticky = 'ew', padx = (10,10), pady = (0, 10))
course_combobox = ttk.Combobox(widgets_frame, values = course)
course_combobox.current
course_combobox.grid(row = 15, column = 0, sticky = 'ew', padx = (10,10), pady = (0, 10))
course_combobox.set('Select Course Type')
#Column G
fs_label = tk.Label(widgets_frame, text = 'Type in if not listed:')
fs_label.grid(row = 16, column = 0, sticky = 'ew', padx = (10,10), pady = (10,10))
site_label = tk.Label(widgets_frame, text = 'Site: ')
site_label.grid(row = 18, column = 0,sticky = 'ew', padx = (10,10), pady = (0, 10))
site_combobox =ttk.Combobox(widgets_frame, values = centers)
site_combobox.current
site_combobox.grid(row = 19, column = 0, sticky = 'ew', padx = (10,10), pady = (0, 10))
site_combobox.set('Select Learning Center')
#Column H
city_label = tk.Label(widgets_frame, text = 'Site City: ')
city_label.grid(row = 20, column = 0,sticky = 'ew', padx = (10,10), pady = (0, 10))
city_entry =ttk.Entry(widgets_frame)
city_combobox =ttk.Combobox(widgets_frame, values = cities)
city_combobox.current
city_combobox.grid(row = 21, column = 0, sticky = 'ew', padx = (10,10), pady = (0, 10))
city_combobox.set('Select City')
#Column I
sp_label = tk.Label(widgets_frame, text = 'State or Province: ')
sp_label.grid(row = 22, column = 0,sticky = 'ew', padx = (10,10), pady = (0, 10))
sp_entry =ttk.Entry(widgets_frame)
sp_combobox =ttk.Combobox(widgets_frame, values = states)
sp_combobox.current
sp_combobox.grid(row = 23, column = 0, sticky = 'ew', padx = (10,10), pady = (0, 10))
sp_combobox.set('Select State or Province')
#Column J
country_label = tk.Label(widgets_frame, text = 'Site Country: ')
country_label.grid(row = 24, column = 0,sticky = 'ew', padx = (10,10), pady = (0, 10))
country_combobox = ttk.Combobox(widgets_frame, values = countries)
country_combobox.current
country_combobox.grid(row = 25, column = 0, sticky = 'ew', padx = (10,10), pady = (0, 10))
country_combobox.set('Country')
#Column K
inst_label = tk.Label(widgets_frame, text = 'Instructor: ')
inst_label.grid(row = 26, column = 0,sticky = 'ew', padx = (10,10), pady = (0, 10))
inst_combobox = ttk.Combobox(widgets_frame, values = instructor)
inst_combobox.current
inst_combobox.grid(row = 27, column = 0, sticky = 'ew', padx = (10,10), pady = (0, 10))
inst_combobox.set('Select Instructor')
#Column L
month_label = tk.Label(widgets_frame, text = 'Month: ')
month_label.grid(row = 28, column = 0,sticky = 'ew', padx = (10,10), pady = (0, 10))
month_combobox = ttk.Combobox(widgets_frame, values = months)
month_combobox.current
month_combobox.grid(row = 29, column = 0, sticky = 'ew', padx = (10,10), pady = (0, 10))
month_combobox.set('Select Month')
#Column M
year_label = tk.Label(widgets_frame, text = 'Year: ')
year_label.grid(row = 30, column = 0, sticky = 'ew', padx = (10,10), pady =(10,10))
year_combobox =ttk.Combobox(widgets_frame, values = years)
year_combobox.current
year_combobox.grid(row = 31, column = 0, sticky = 'ew', padx = (10,10), pady = (0, 10))
year_combobox.set('Select Year')
#Column N
notes_label = tk.Label(widgets_frame, text = 'Notes: ')
notes_label.grid(row = 32, column = 0,sticky = 'ew', padx = (10,10), pady = (0, 10))
notes_entry =ttk.Entry(widgets_frame)
notes_entry.insert(0,' ')
notes_entry.bind('<FocusIn>', lambda e: notes_entry.delete('0', 'end'))
notes_entry.grid(row = 33, column = 0, sticky = 'ew', padx = (10,10), pady = (0, 10))
#Separator
button_separator = ttk.Separator(widgets_frame)
button_separator.grid(row = 34, column = 0, sticky = 'ew', padx =(20,10), pady = (20,10))
#Submit Button saves the input to Excel Sheet
button = ttk.Button(widgets_frame, text = 'Write That Down!', command = insert_row)
button.grid(row = 35, column = 0, sticky = 'nsew', padx = (10,10), pady = (0, 10))
#Separator for buttons
separator = ttk.Separator(widgets_frame)
separator.grid(row = 1, column = 2, padx =(20,10), pady = (20,10))
#Save Confirmation
treeFrame = ttk.Frame(frame)
treeFrame.grid(row=0, column=3, pady=20)
treeScroll = ttk.Scrollbar(treeFrame)
treeScroll.pack(side ='right', fill = 'y')
cols = ('Last Name', 'Middle Name', 'First Name', 'Nationality', 'Employer', 'Course', 'Site', 'City', 'State_Province', 'Country', 'Instructor', 'Month', 'Year', 'Notes')
treeview = ttk.Treeview(treeFrame, show="headings",
yscrollcommand=treeScroll.set, columns=cols, height= 50,)
#Column A
treeview.column('Last Name', width = 150)
#Column B
treeview.column('Middle Name', width = 150)
#Column C
treeview.column('First Name', width = 150)
#Column D
treeview.column('Nationality', width = 150)
#Column E
treeview.column('Employer', width = 150)
#Column F
treeview.column('Course', width = 150)
#Column G
treeview.column('Site', width = 150)
#Column H
treeview.column('City', width = 150)
#Column I
treeview.column('State_Province', width = 150)
#Column J
treeview.column('Country', width = 150)
#Column K
treeview.column('Instructor', width = 150)
#Column L
treeview.column('Month', width = 150)
#Column M
treeview.column('Year', width = 150)
#Column N
treeview.column('Notes', width = 150)
treeview.pack()
treeScroll.config(command=treeview.yview)
load_data()
root.mainloop()