You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:修复提交按钮与文件路径问题

  1. 将Excel读写逻辑移到Submit函数内部,确保点击按钮时才执行;
  2. 正确获取输入框/下拉菜单的内容,组装成要保存的行数据;
  3. 处理文件不存在的情况:如果指定路径的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:17:34