text 以下谷歌文档包含我的代码的屏幕截图以及说明。我现在遇到的问题是,并非所有数据都被附加到 .csv 文件中。当我输入所有字段来添加学生时,只有 SID、名字、姓氏被传递到 .csv 文件。
我尝试通过以下方式附加数据: 使用 CSV writer() 方法将数据附加到 Python 中的 csv 文件 使用 CSV DictWriter() 方法将数据附加到 Python 中的 csv 文件 使用 pandas 将数据附加到 Python 中的 csv 文件
这是代码:
import tkinter as tk
from tkinter import ttk
from tkinter import filedialog # Import filedialog from tkinter
import pandas as pd
from tkinter.filedialog import askopenfile
import csv
import numpy as np # Required for handling NaN values
# Define global variables to store and manipulate data
student_data = []
imported_data = "" # Store the imported data
def import_data():
# Open a CSV file dialog and get the selected file
file = askopenfile(mode='r', filetypes=[('CSV Files', '*.csv')])
if file:
# Use pandas to read the CSV file
df = pd.read_csv(file)
# Iterate over the rows in the DataFrame
for _, row in df.iterrows():
student_info = {
'SID': row['SID'],
'FirstName': row['FirstName'],
'LastName': row['LastName'],
'Email': row['Email'],
'Homeworks(hw1, hw2, hw3)': [str(row[f'HW{i}']) for i in range(1, 4)],
'Quizzes(quiz1, quiz2, quiz3, quiz4)': [str(row[f'Quiz{i}']) for i in range(1, 5)],
'MidtermExam': str(row['MidtermExam']),
'FinalExam': str(row['FinalExam'])
}
# Display the student information in the text widget
imported_text.insert(tk.END, f"SID: {student_info['SID']}\n")
imported_text.insert(tk.END, f"FirstName: {student_info['FirstName']}\n")
imported_text.insert(tk.END, f"LastName: {student_info['LastName']}\n")
imported_text.insert(tk.END, f"Email: {student_info['Email']}\n")
imported_text.insert(tk.END, f"Homeworks(hw1, hw2, hw3): {', '.join(student_info['Homeworks(hw1, hw2, hw3)'])}\n")
imported_text.insert(tk.END, f"Quizzes(quiz1, quiz2, quiz3, quiz4): {', '.join(student_info['Quizzes(quiz1, quiz2, quiz3, quiz4)'])}\n")
imported_text.insert(tk.END, f"MidtermExam: {student_info['MidtermExam']}\n")
imported_text.insert(tk.END, f"FinalExam: {student_info['FinalExam']}\n")
imported_text.insert(tk.END, "\n") # Add a blank line to separate students
def display_imported_data():
# Clear the text box and insert the imported data
imported_text.config(state=tk.NORMAL) # Enable text widget for editing
imported_text.delete(1.0, tk.END)
imported_text.insert(tk.END, imported_data)
imported_text.config(state=tk.DISABLED) # Disable text widget for read-only
def add_student():
# Retrieve input values from the user
sid = int(sid_entry.get()) if sid_entry.get() else 0 # Convert to integer or default to 0 if empty
first_name = first_name_entry.get()
last_name = last_name_entry.get()
email = email_entry.get()
# Retrieve homework scores from the input fields and validate
hw1 = int(hw1_entry.get()) if hw1_entry.get() else 0 # Convert to integer or default to 0 if empty
hw2 = int(hw2_entry.get()) if hw2_entry.get() else 0
hw3 = int(hw3_entry.get()) if hw3_entry.get() else 0
# Retrieve quiz scores from the input fields and validate
quiz1 = int(quiz1_entry.get()) if quiz1_entry.get() else 0 # Convert to integer or default to 0 if empty
quiz2 = int(quiz2_entry.get()) if quiz2_entry.get() else 0
quiz3 = int(quiz3_entry.get()) if quiz3_entry.get() else 0
quiz4 = int(quiz4_entry.get()) if quiz4_entry.get() else 0
midterm = int(midterm_entry.get()) if midterm_entry.get() else 0 # Convert to integer or default to 0 if empty
final = int(final_entry.get()) if final_entry.get() else 0
# Call the add_student_data function with user inputs, including homework and quiz scores
add_student_data(sid, first_name, last_name, email, hw1, hw2, hw3, quiz1, quiz2, quiz3, quiz4, midterm, final)
def add_student_data(sid, first_name, last_name, email, hw1, hw2, hw3, quiz1, quiz2, quiz3, quiz4, midterm, final):
global student_data
# Create a new student record
new_student = {
'SID': sid,
'FirstName': first_name,
'LastName': last_name,
'Email': email,
'HW1': hw1,
'HW2': hw2,
'HW3': hw3,
'Quiz1': quiz1,
'Quiz2': quiz2,
'Quiz3': quiz3,
'Quiz4': quiz4,
'MidtermExam': midterm,
'FinalExam': final
}
# Add the new student to the data list
student_data.append(new_student)
# Save the updated data to the CSV file
save_data_to_csv()
def clear_input_fields():
# Clear input fields
sid_entry.delete(0, 'end')
first_name_entry.delete(0, 'end')
last_name_entry.delete(0, 'end')
email_entry.delete(0, 'end')
hw1_entry.delete(0, 'end')
hw2_entry.delete(0, 'end')
hw3_entry.delete(0, 'end')
quiz1_entry.delete(0, 'end')
quiz2_entry.delete(0, 'end')
quiz3_entry.delete(0, 'end')
quiz4_entry.delete(0, 'end')
midterm_entry.delete(0, 'end')
final_entry.delete(0, 'end')
def delete_student():
# Retrieve input value (SID) from the user
sid = int(delete_sid_entry.get())
# Call the delete_student_data function with user input
delete_student_data(sid)
def delete_student_data(sid):
# Open the original CSV file and a temporary CSV file
with open('Student_data.csv', newline='') as csvfile, \
open('Temp_Student_data.csv', mode='w', newline='') as temp_csvfile:
csvFile = csv.DictReader(csvfile)
fieldnames = csvFile.fieldnames
# Create a CSV writer for the temporary file
writer = csv.DictWriter(temp_csvfile, fieldnames=fieldnames)
writer.writeheader()
# Iterate through the original CSV and copy non-matching students to the temporary file
for student in csvFile:
if int(student['SID']) != sid:
writer.writerow(student)
# Replace the original file with the temporary file
import shutil
shutil.move('Temp_Student_data.csv', 'Student_data.csv')
# Clear input field
delete_sid_entry.delete(0, 'end')
def search_student():
# Retrieve input value (SID) from the user
sid = int(search_sid_entry.get())
# Search for the student in the CSV file
found_student = None
with open('Student_data.csv', newline='') as csvfile:
csvFile = csv.DictReader(csvfile)
for student in csvFile:
if int(student['SID']) == sid:
found_student = student
break
if found_student:
# Format the student data
homeworks = [found_student[f'HW{i}'] for i in range(1, 4)]
quizzes = [found_student[f'Quiz{i}'] for i in range(1, 5)]
formatted_student = f"SID: {found_student['SID']}\n" \
f"FirstName: {found_student['FirstName']}\n" \
f"LastName: {found_student['LastName']}\n" \
f"Email: {found_student['Email']}\n" \
f"Homeworks: ({', '.join(homeworks)})\n" \
f"Quizzes: ({', '.join(quizzes)})\n" \
f"MidtermExam: {found_student['MidtermExam']}\n" \
f"FinalExam: {found_student['FinalExam']}"
# Update the text box with the formatted student data
searched_student_text.delete(1.0, tk.END) # Clear previous content
searched_student_text.insert(tk.END, formatted_student)
result_label.config(text="Student found:")
else:
searched_student_text.delete(1.0, tk.END) # Clear previous content
searched_student_text.insert(tk.END, "Student not found")
def search_student_data(sid, student_data):
# Implement searching for a student by SID and return their data
for student in student_data:
if student['SID'] == sid:
return student
return None
def update_scores():
# Retrieve input values (SID and scores) from the user
sid = int(update_sid_entry.get())
hw1 = int(update_hw1_entry.get())
hw2 = int(update_hw2_entry.get())
hw3 = int(update_hw3_entry.get())
quiz1 = int(update_quiz1_entry.get())
quiz2 = int(update_quiz2_entry.get())
quiz3 = int(update_quiz3_entry.get())
quiz4 = int(update_quiz4_entry.get())
midterm = int(update_midterm_entry.get())
final = int(update_final_entry.get())
# Call the update_scores_data function with user inputs
update_scores_data(sid, hw1, hw2, hw3, quiz1, quiz2, quiz3, quiz4, midterm, final)
def update_scores_data(sid, hw1, hw2, hw3, quiz1, quiz2, quiz3, quiz4, midterm, final):
global student_data
# Find the student by SID
student_found = False
for student in student_data:
if student['SID'] == sid:
student_found = True
# Update the scores
student['HW1'] = hw1
student['HW2'] = hw2
student['HW3'] = hw3
student['Quiz1'] = quiz1
student['Quiz2'] = quiz2
student['Quiz3'] = quiz3
student['Quiz4'] = quiz4
student['MidtermExam'] = midterm
student['FinalExam'] = final
break
if student_found:
# Save the updated data to the CSV file
save_data_to_csv()
else:
print("Student not found by SID")
def export_data():
# Implement exporting data to a .csv file
pass
def save_data_to_csv():
global student_data
# Specify the CSV file path
csv_file_path = 'Student_data.csv'
# Write the data to the CSV file in append mode
with open(csv_file_path, mode='a', newline='') as csvfile:
fieldnames = ['SID', 'FirstName', 'LastName', 'Email', 'HW1', 'HW2', 'HW3',
'Quiz1', 'Quiz2', 'Quiz3', 'Quiz4', 'MidtermExam', 'FinalExam']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# If the file is empty, write the header row
if csvfile.tell() == 0:
writer.writeheader()
# Write the data for the new student to the CSV file
for student in student_data:
writer.writerow(student)
# Create the main window
root = tk.Tk()
root.title("Gradebook System")
# Create a notebook to organize different functionalities
notebook = ttk.Notebook(root)
notebook.pack(fill="both", expand=True)
# Create tabs for each functionality
import_tab = ttk.Frame(notebook)
add_delete_tab = ttk.Frame(notebook)
search_tab = ttk.Frame(notebook)
update_tab = ttk.Frame(notebook)
export_tab = ttk.Frame(notebook)
notebook.add(import_tab, text="Import Data")
notebook.add(add_delete_tab, text="Add/Delete Student")
notebook.add(search_tab, text="Search Student")
notebook.add(update_tab, text="Update Scores")
notebook.add(export_tab, text="Export Data")
# Add Student Tab
sid_label = tk.Label(add_delete_tab, text="SID to Add:")
sid_entry = tk.Entry(add_delete_tab)
first_name_label = tk.Label(add_delete_tab, text="FirstName:")
first_name_entry = tk.Entry(add_delete_tab)
last_name_label = tk.Label(add_delete_tab, text="LastName:")
last_name_entry = tk.Entry(add_delete_tab)
email_label = tk.Label(add_delete_tab, text="Email:")
email_entry = tk.Entry(add_delete_tab)
hw1_label = tk.Label(add_delete_tab, text="HW1:")
hw1_entry = tk.Entry(add_delete_tab)
hw2_label = tk.Label(add_delete_tab, text="HW2:")
hw2_entry = tk.Entry(add_delete_tab)
hw3_label = tk.Label(add_delete_tab, text="HW3:")
hw3_entry = tk.Entry(add_delete_tab)
quiz1_label = tk.Label(add_delete_tab, text="Quiz 1:")
quiz1_entry = tk.Entry(add_delete_tab)
quiz2_label = tk.Label(add_delete_tab, text="Quiz 2:")
quiz2_entry = tk.Entry(add_delete_tab)
quiz3_label = tk.Label(add_delete_tab, text="Quiz 3:")
quiz3_entry = tk.Entry(add_delete_tab)
quiz4_label = tk.Label(add_delete_tab, text="Quiz 4:")
quiz4_entry = tk.Entry(add_delete_tab)
midterm_label = tk.Label(add_delete_tab, text="MidtermExam:")
midterm_entry = tk.Entry(add_delete_tab)
final_label = tk.Label(add_delete_tab, text="FinalExam:")
final_entry = tk.Entry(add_delete_tab)
add_student_button = tk.Button(add_delete_tab, text="Add Student", command=add_student)
# Place labels, input fields, and buttons in the Add Student Tab
sid_label.grid(row=1, column=0, padx=5, pady=5, sticky=tk.W)
sid_entry.grid(row=1, column=1, padx=5, pady=5)
first_name_label.grid(row=2, column=0, padx=5, pady=5, sticky=tk.W)
first_name_entry.grid(row=2, column=1, padx=5, pady=5)
last_name_label.grid(row=3, column=0, padx=5, pady=5, sticky=tk.W)
last_name_entry.grid(row=3, column=1, padx=5, pady=5)
email_label.grid(row=4, column=0, padx=5, pady=5, sticky=tk.W)
email_entry.grid(row=4, column=1, padx=5, pady=5)
hw1_label.grid(row=5, column=0, padx=5, pady=5, sticky=tk.W)
hw1_entry.grid(row=5, column=1, padx=5, pady=5)
hw2_label.grid(row=6, column=0, padx=5, pady=5, sticky=tk.W)
hw2_entry.grid(row=6, column=1, padx=5, pady=5)
hw3_label.grid(row=7, column=0, padx=5, pady=5, sticky=tk.W)
hw3_entry.grid(row=7, column=1, padx=5, pady=5)
quiz1_label.grid(row=8, column=0, padx=5, pady=5, sticky=tk.W)
quiz1_entry.grid(row=8, column=1, padx=5, pady=5)
quiz2_label.grid(row=9, column=0, padx=5, pady=5, sticky=tk.W)
quiz2_entry.grid(row=9, column=1, padx=5, pady=5)
quiz3_label.grid(row=10, column=0, padx=5, pady=5, sticky=tk.W)
quiz3_entry.grid(row=10, column=1, padx=5, pady=5)
quiz4_label.grid(row=11, column=0, padx=5, pady=5, sticky=tk.W)
quiz4_entry.grid(row=11, column=1, padx=5, pady=5)
midterm_label.grid(row=12, column=0, padx=5, pady=5, sticky=tk.W)
midterm_entry.grid(row=12, column=1, padx=5, pady=5)
final_label.grid(row=13, column=0, padx=5, pady=5, sticky=tk.W)
final_entry.grid(row=13, column=1, padx=5, pady=5)
add_student_button.grid(row=14, column=0, columnspan=2, padx=5, pady=10)
# Define entry fields for homeworks
hw1_label = tk.Label(add_delete_tab, text="Homework 1:")
hw1_entry = tk.Entry(add_delete_tab)
hw2_label = tk.Label(add_delete_tab, text="Homework 2:")
hw2_entry = tk.Entry(add_delete_tab)
hw3_label = tk.Label(add_delete_tab, text="Homework 3:")
hw3_entry = tk.Entry(add_delete_tab)
# Define entry fields for quizzes
quiz1_label = tk.Label(add_delete_tab, text="Quiz 1:")
quiz1_entry = tk.Entry(add_delete_tab)
quiz2_label = tk.Label(add_delete_tab, text="Quiz 2:")
quiz2_entry = tk.Entry(add_delete_tab)
quiz3_label = tk.Label(add_delete_tab, text="Quiz 3:")
quiz3_entry = tk.Entry(add_delete_tab)
quiz4_label = tk.Label(add_delete_tab, text="Quiz 4:")
quiz4_entry = tk.Entry(add_delete_tab)
# Define entry fields for midterm and final exams
midterm_label = tk.Label(add_delete_tab, text="Midterm Exam:")
midterm_entry = tk.Entry(add_delete_tab)
final_label = tk.Label(add_delete_tab, text="Final Exam:")
final_entry = tk.Entry(add_delete_tab)
# Delete Student Tab
delete_sid_label = tk.Label(add_delete_tab, text="SID to Delete:")
delete_sid_entry = tk.Entry(add_delete_tab)
delete_student_button = tk.Button(add_delete_tab, text="Delete Student", command=delete_student)
# Delete Student Tab
delete_sid_label.grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)
delete_sid_entry.grid(row=0, column=1, padx=10, pady=5)
delete_student_button.grid(row=0, column=2, columnspan=2, padx=5, pady=10)
# Import Data Tab
import_data_button = tk.Button(import_tab, text="Import Data", command=import_data)
import_data_button.pack(padx=20, pady=50)
# Create a text box to display the imported data
imported_text = tk.Text(import_tab, height=20, width=50)
imported_text.pack(padx=20, pady=10)
# Optionally, you can add a label to indicate the import status
import_status_label = tk.Label(import_tab, text="")
import_status_label.pack()
# Search Student Tab
search_sid_label = tk.Label(search_tab, text="SID to Search:")
search_sid_entry = tk.Entry(search_tab)
search_student_button = tk.Button(search_tab, text="Search Student", command=search_student)
result_label = tk.Label(search_tab, text="")
# Create a text box to display the searched student
searched_student_text = tk.Text(search_tab, height=10, width=50)
searched_student_text.grid(row=3, column=0, columnspan=2, padx=20, pady=10)
# Place labels, input fields, and buttons in the Search Student Tab
search_sid_label.grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)
search_sid_entry.grid(row=0, column=1, padx=5, pady=5)
search_student_button.grid(row=1, column=0, columnspan=2, padx=5, pady=10)
result_label.grid(row=2, column=0, columnspan=2, padx=5, pady=10)
# Update Scores Tab
update_sid_label = tk.Label(update_tab, text="SID to Update:")
update_sid_entry = tk.Entry(update_tab)
update_hw1_label = tk.Label(update_tab, text="New HW1 Score:")
update_hw1_entry = tk.Entry(update_tab)
update_hw2_label = tk.Label(update_tab, text="New HW2 Score:")
update_hw2_entry = tk.Entry(update_tab)
update_hw3_label = tk.Label(update_tab, text="New HW3 Score:")
update_hw3_entry = tk.Entry(update_tab)
update_quiz1_label = tk.Label(update_tab, text="New Quiz 1 Score:")
update_quiz1_entry = tk.Entry(update_tab)
update_quiz2_label = tk.Label(update_tab, text="New Quiz 2 Score:")
update_quiz2_entry = tk.Entry(update_tab)
update_quiz3_label = tk.Label(update_tab, text="New Quiz 3 Score:")
update_quiz3_entry = tk.Entry(update_tab)
update_quiz4_label = tk.Label(update_tab, text="New Quiz 4 Score:")
update_quiz4_entry = tk.Entry(update_tab)
update_midterm_label = tk.Label(update_tab, text="New Midterm Score:")
update_midterm_entry = tk.Entry(update_tab)
update_final_label = tk.Label(update_tab, text="New Final Score:")
update_final_entry = tk.Entry(update_tab)
update_scores_button = tk.Button(update_tab, text="Update Scores", command=update_scores)
# Place labels, input fields, and buttons in the Update Scores Tab
update_sid_label.grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)
update_sid_entry.grid(row=0, column=1, padx=5, pady=5)
update_hw1_label.grid(row=1, column=0, padx=5, pady=5, sticky=tk.W)
update_hw1_entry.grid(row=1, column=1, padx=5, pady=5)
update_hw2_label.grid(row=2, column=0, padx=5, pady=5, sticky=tk.W)
update_hw2_entry.grid(row=2, column=1, padx=5, pady=5)
update_hw3_label.grid(row=3, column=0, padx=5, pady=5, sticky=tk.W)
update_hw3_entry.grid(row=3, column=1, padx=5, pady=5)
update_quiz1_label.grid(row=4, column=0, padx=5, pady=5, sticky=tk.W)
update_quiz1_entry.grid(row=4, column=1, padx=5, pady=5)
update_quiz2_label.grid(row=5, column=0, padx=5, pady=5, sticky=tk.W)
update_quiz2_entry.grid(row=5, column=1, padx=5, pady=5)
update_quiz3_label.grid(row=6, column=0, padx=5, pady=5, sticky=tk.W)
update_quiz3_entry.grid(row=6, column=1, padx=5, pady=5)
update_quiz4_label.grid(row=7, column=0, padx=5, pady=5, sticky=tk.W)
update_quiz4_entry.grid(row=7, column=1, padx=5, pady=5)
update_midterm_label.grid(row=8, column=0, padx=5, pady=5, sticky=tk.W)
update_midterm_entry.grid(row=8, column=1, padx=5, pady=5)
update_final_label.grid(row=9, column=0, padx=5, pady=5, sticky=tk.W)
update_final_entry.grid(row=9, column=1, padx=5, pady=5)
update_scores_button.grid(row=10, column=0, columnspan=2, padx=5, pady=10)
# Export Data Tab
export_button = tk.Button(export_tab, text="Export Data", command=export_data)
# Place the export button in the Export Data Tab
export_button.pack(padx=20, pady=20)
# Create the main window
root.mainloop()
您似乎正在使用 Python 和 Tkinter 开发成绩簿系统。您的代码提供导入、添加、删除、搜索、更新以及可能导出学生数据的功能。但是,您提到您遇到了问题,因为并非所有数据都附加到 CSV 文件中。让我们先解决这个问题。
为了确保所有数据都正确附加到 CSV 文件,您应该对 add_student_data 和 save_data_to_csv 函数进行一些更改。具体来说,您应该更新字段名称列表中的列名称,以匹配您在学生词典中使用的键。以下是这些函数的修改后的代码:
def add_student_data(sid, first_name, last_name, email, hw1, hw2, hw3, quiz1, quiz2, quiz3, quiz4, midterm, final):
global student_data
# Create a new student record
new_student = {
'SID': sid,
'FirstName': first_name,
'LastName': last_name,
'Email': email,
'HW1': hw1,
'HW2': hw2,
'HW3': hw3,
'Quiz1': quiz1,
'Quiz2': quiz2,
'Quiz3': quiz3,
'Quiz4': quiz4,
'MidtermExam': midterm,
'FinalExam': final
}
# Add the new student to the data list
student_data.append(new_student)
# Save the updated data to the CSV file
save_data_to_csv()
def save_data_to_csv():
global student_data
# Specify the CSV file path
csv_file_path = 'Student_data.csv'
# Write the data to the CSV file in append mode
with open(csv_file_path, mode='a', newline='') as csvfile:
fieldnames = ['SID', 'FirstName', 'LastName', 'Email', 'HW1', 'HW2', 'HW3',
'Quiz1', 'Quiz2', 'Quiz3', 'Quiz4', 'MidtermExam', 'FinalExam']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# If the file is empty, write the header row
if csvfile.tell() == 0:
writer.writeheader()
# Write the data for the new student to the CSV file
for student in student_data:
writer.writerow(student)
这些更改应确保所有学生数据都正确附加到 CSV 文件中。