使用 Excel 工作簿/工作表填充 ttk.combobox 选项

问题描述 投票:0回答:0

我有一个基于 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()
list tkinter combobox openpyxl
© www.soinside.com 2019 - 2024. All rights reserved.