如何在每次点击按钮时添加新标签

0 投票
2 回答
59 浏览
提问于 2025-04-14 18:03

我写了一个代码,用来计算学生的平均分,我想让结果显示在窗口的底部。问题是每次我点击“提交”按钮时,我希望能出现一个新的结果标签。现在的情况是,它只是把原来的标签替换成新的数据。

import tkinter as tk

def calculate_status(average): 
    if 0 <= average <= 39:
        return "Failed"  
    elif 40 <= average <= 55:
        return "Passed"  
    elif 56 <= average <= 70:
        return "Great" 
    elif 71 <= average <= 100:
        return "Distinctive" 

def grade(name, grades): 
    average = (sum(grades) / len(grades)) 
    status = calculate_status(average)
    result_label = tk.Label(window, text=f"STUDENT NAME: {name}\nAVERAGE: {average}\nSTATUS: {status}", wraplength=300)
    result_label.grid(row=3, columnspan=2, padx=5, pady=5)
    last_row += 8

def get_grades():
    grade_text = input_grade_entry.get()
    grades = [float(grade) for grade in grade_text.split(",")]
    for grade in grades:
        if not 0 <= grade <= 100:
            input_grade_entry.delete(0, tk.END)
            input_grade_entry.insert(0, "Grades must be between 0 and 100 separated by commas.")
            return []
    return grades

def get_student_info():
    global last_row
    name = name_entry.get()
    grades = get_grades()
    if grades:
        grade(name, grades)

# Create the main window
window = tk.Tk()
window.title("Student Grades")

# Create and place labels and entry widgets
tk.Label(window, text="Student Name:").grid(row=0, column=0, padx=5, pady=5, sticky="e")
name_entry = tk.Entry(window)
name_entry.grid(row=0, column=1, padx=5, pady=5)

tk.Label(window, text="Grades (comma-separated):").grid(row=1, column=0, padx=5, pady=5, sticky="e")
input_grade_entry = tk.Entry(window)
input_grade_entry.grid(row=1, column=1, padx=5, pady=5)

# Create and place the submit button
submit_button = tk.Button(window, text="Submit", command=get_student_info)
submit_button.grid(row=2, columnspan=2, padx=5, pady=5)

# Initialize last row
last_row = 3

# Start the GUI event loop
window.mainloop()

我其实也不太清楚,所以才来这里问的...

2 个回答

0

这里是我在代码中做出更改的解释。

import tkinter as tk

#Declare a variable count here.
count = 0

def calculate_status(average): 
    if 0 <= average <= 39:
        return "Failed"  
    elif 40 <= average <= 55:
        return "Passed"  
    elif 56 <= average <= 70:
        return "Great" 
    elif 71 <= average <= 100:
        return "Distinctive" 

def grade(name, grades):
    global last_row, count
    average = (sum(grades) / len(grades)) 
    status = calculate_status(average)
    
    # Dont declare a variable name for the label. row value should be multiple of count
    tk.Label(window, text=f"STUDENT NAME: {name}\nAVERAGE: {average}\nSTATUS: {status}", wraplength=300).grid(row=2 + (count*4), columnspan=2, padx=5, pady=5)
    
    last_row += 8

def get_grades():
    grade_text = input_grade_entry.get()
    grades = [float(grade) for grade in grade_text.split(",")]
    for grade in grades:
        if not 0 <= grade <= 100:
            input_grade_entry.delete(0, tk.END)
            input_grade_entry.insert(0, "Grades must be between 0 and 100 separated by commas.")
            return []
    return grades

def get_student_info():
    
    # Count every click and make the variable count global

    global last_row, count
    count = count + 1
    name = name_entry.get()
    grades = get_grades()
    if grades:
        grade(name, grades)

# Create the main window
window = tk.Tk()
window.title("Student Grades")

# Create and place labels and entry widgets
tk.Label(window, text="Student Name:").grid(row=0, column=0, padx=5, pady=5, sticky="e")
name_entry = tk.Entry(window)
name_entry.grid(row=0, column=1, padx=5, pady=5)

tk.Label(window, text="Grades (comma-separated):").grid(row=1, column=0, padx=5, pady=5, sticky="e")
input_grade_entry = tk.Entry(window)
input_grade_entry.grid(row=1, column=1, padx=5, pady=5)

# Create and place the submit button
submit_button = tk.Button(window, text="Submit", command=get_student_info)
submit_button.grid(row=2, columnspan=2, padx=5, pady=5)

# Initialize last row
last_row = 3

# Start the GUI event loop
window.mainloop()
0

你已经为每个结果创建了新的标签,但你把它们放在了同一个位置(行=3),这样新创建的标签就会覆盖在之前的标签上。

建议你为结果标签创建一个框架,然后在这些标签上使用 .pack() 方法,这样就能避免重叠的问题。

...
def grade(name, grades):
    average = (sum(grades) / len(grades))
    status = calculate_status(average)
    # create label as child of frame
    result_label = tk.Label(frame, text=f"STUDENT NAME: {name}\nAVERAGE: {average}\nSTATUS: {status}", wraplength=300)
    # simply use .pack()
    result_label.pack(padx=5, pady=5)
...

# create a frame for the result labels
frame = tk.Frame(window)
frame.grid(row=3, columnspan=2)

# Start the GUI event loop
window.mainloop()

撰写回答