Tkinter+Python开发船员追踪Excel记录应用遇问题求助
问题描述
我是Tkinter和Python应用开发新手,想开发一款应用将日期、人员、地点三个数据保存到Excel工作表。参考网络示例代码整合Excel保存功能时遇到以下问题:
- 提交按钮无效,数据无法保存到与.py文件同目录的Excel文件,不知道怎么正确指定文件路径;
- 不清楚如何实现每次点击提交按钮时自动保存当日日期。
参考示例代码
# Example Code import openpyxl from tkinter import * from tkinter import messagebox def register(): # Get the user input from the form first_name = first_name_entry.get() Last_name = Last_name_entry.get() email = email_entry.get() Mobile = Mobile_entry.get() # Create a new row with the user input new_row = [first_name, Last_name, email, Mobile] # Append the new row to the Excel sheet workbook = openpyxl.load_workbook("registration_data.xlsx") sheet = workbook.active sheet.append(new_row) workbook.save("registration_data.xlsx") messagebox.showinfo("Success", "Registration successful!") # Create the main tkinter window root = Tk() root.title("Registration Form") root.geometry('300x300') # Create labels and entry fields for each input first_name_label = Label(root, text="First Name:") first_name_label.pack() first_name_entry = Entry(root) first_name_entry.pack() Last_name_label = Label(root, text="Last Name:") Last_name_label.pack() Last_name_entry = Entry(root) Last_name_entry.pack() email_label = Label(root, text="Email:") email_label.pack() email_entry = Entry(root) email_entry.pack() Mobile_label = Label(root, text="Mobile:") Mobile_label.pack() Mobile_entry = Entry(root) Mobile_entry.pack() register_button = Button(root, text="Register", command=register) register_button.pack() root.mainloop()
本人编写的代码
# My code up to this point import openpyxl from tkinter import * from tkinter import messagebox ws = Tk() ws.title("Crew Tracker") ws.geometry('300x300') nameLb1 = Label(ws, text="Select Crew") nameLb1.grid(row=0, column=0) nameLb2 = Label(ws, text="Select Site Number") nameLb2.grid(row=1, column=0) nameLb3 = Label(ws, text="Enter Crew") nameLb3.grid(row=3, column=0) nameLb3_entry = Entry(ws) nameLb3_entry.grid(row=3, column=1) nameLb4 = Label(ws, text="Enter Site Number") nameLb4.grid(row=2, column=0) nameLb4_entry = Entry(ws) nameLb4_entry.grid(row=2, column=1) site_number = StringVar() site_number.set("Site Number") site = OptionMenu(ws, site_number, "OK1908", "HX4735", "OK1598", "HX4947") site.grid(row=1, column=1) Crew = StringVar() Crew.set("Crew") Crews = OptionMenu(ws, Crew, "#1 Ray", "#2 Carlos", "#3 Raul", "#4 Jorge") Crews.grid(row=0, column=1) new_row = [nameLb3_entry, nameLb4_entry] workbook = openpyxl.load_workbook("Crew_tracker_#1.xlsx") sheet = workbook.active workbook.save("Crew_tracker_#1.xlsx") def Submit(): nameLb3_entry.get() nameLb4_entry.get() Submit_button = Button(ws, text="Submit", command=Submit) Submit_button.grid(row=4, column=1) messagebox.showinfo("Success", "Submittal Successful") ws.mainloop()
解决方案
针对问题1:修复提交按钮与文件路径问题
- 将Excel读写逻辑移到
Submit函数内部,确保点击按钮时才执行; - 正确获取输入框/下拉菜单的内容,组装成要保存的行数据;
- 处理文件不存在的情况:如果指定路径的Excel文件不存在,自动创建新工作簿和工作表。
针对问题2:自动添加当日日期
引入datetime模块,用datetime.date.today().strftime("%Y-%m-%d")获取格式化后的当日日期,添加到要保存的行数据开头或指定位置。
修改后的完整代码
import openpyxl from tkinter import * from tkinter import messagebox from datetime import date ws = Tk() ws.title("Crew Tracker") ws.geometry('300x300') # 界面元素 nameLb1 = Label(ws, text="Select Crew") nameLb1.grid(row=0, column=0) nameLb2 = Label(ws, text="Select Site Number") nameLb2.grid(row=1, column=0) nameLb3 = Label(ws, text="Enter Crew") nameLb3.grid(row=3, column=0) nameLb3_entry = Entry(ws) nameLb3_entry.grid(row=3, column=1) nameLb4 = Label(ws, text="Enter Site Number") nameLb4.grid(row=2, column=0) nameLb4_entry = Entry(ws) nameLb4_entry.grid(row=2, column=1) # 下拉菜单变量 site_number = StringVar() site_number.set("Site Number") site = OptionMenu(ws, site_number, "OK1908", "HX4735", "OK1598", "HX4947") site.grid(row=1, column=1) Crew = StringVar() Crew.set("Crew") Crews = OptionMenu(ws, Crew, "#1 Ray", "#2 Carlos", "#3 Raul", "#4 Jorge") Crews.grid(row=0, column=1) def Submit(): # 获取当日日期,格式化为YYYY-MM-DD today_date = date.today().strftime("%Y-%m-%d") # 获取用户输入:优先下拉菜单,下拉未选择则用输入框内容 crew = Crew.get() if Crew.get() != "Crew" else nameLb3_entry.get().strip() site = site_number.get() if site_number.get() != "Site Number" else nameLb4_entry.get().strip() # 验证输入是否为空 if not crew or not site: messagebox.showwarning("Warning", "请填写完整的人员和地点信息") return # 组装要保存的行数据 new_row = [today_date, crew, site] # 处理Excel文件读写 try: # 尝试加载已有文件 workbook = openpyxl.load_workbook("Crew_tracker_#1.xlsx") sheet = workbook.active except FileNotFoundError: # 文件不存在则创建新工作簿 workbook = openpyxl.Workbook() sheet = workbook.active # 添加表头 sheet.append(["日期", "人员", "地点"]) # 添加新行并保存 sheet.append(new_row) workbook.save("Crew_tracker_#1.xlsx") messagebox.showinfo("Success", "提交成功!") Submit_button = Button(ws, text="Submit", command=Submit) Submit_button.grid(row=4, column=1) ws.mainloop()
内容的提问来源于stack exchange,提问作者Andres Pereda
相关产品推荐
相关产品推荐

