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

如何在Tkinter中点击Submit按钮时新增结果标签而非替换旧标签

解决Tkinter点击Submit按钮新增结果标签的问题

现有一段计算学生平均分的Tkinter代码,期望每次点击「Submit」按钮时在窗口底部新增一个显示结果的Label组件,但当前代码会用新数据替换已有的标签,无法实现新增效果。原代码如下:

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()

修改后的代码

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): 
    global last_row  # 声明使用全局变量last_row
    average = (sum(grades) / len(grades)) 
    status = calculate_status(average)
    result_label = tk.Label(window, text=f"STUDENT NAME: {name}\nAVERAGE: {average:.2f}\nSTATUS: {status}", wraplength=300)
    result_label.grid(row=last_row, columnspan=2, padx=5, pady=5)  # 使用动态行号定位新标签
    last_row += 1  # 更新行号,确保下一个标签在下方

def get_grades():
    grade_text = input_grade_entry.get()
    # 清空之前的错误提示文本
    if grade_text == "Grades must be between 0 and 100 separated by commas." or grade_text == "Invalid input! Use numbers separated by commas.":
        input_grade_entry.delete(0, tk.END)
        return []
    try:
        grades = [float(grade.strip()) for grade in grade_text.split(",")]
    except ValueError:
        input_grade_entry.delete(0, tk.END)
        input_grade_entry.insert(0, "Invalid input! Use numbers separated by commas.")
        return []
    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():
    name = name_entry.get().strip()
    if not name:
        return
    grades = get_grades()
    if grades:
        grade(name, grades)
        # 提交后清空输入框,方便下次操作
        name_entry.delete(0, tk.END)
        input_grade_entry.delete(0, tk.END)

# 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()

核心修改说明

  1. 全局变量声明:在grade函数中添加global last_row,确保函数能修改全局的行号变量,而不是创建局部变量。
  2. 动态行号定位:将结果标签的grid行参数从固定的row=3改为row=last_row,每次新增标签后将last_row自增1,保证新标签始终出现在上一个标签的下方。
  3. 输入体验优化:
    • 捕获非数字输入的异常并给出提示
    • 提交成功后自动清空输入框
    • 平均分保留两位小数,显示更规范

内容的提问来源于stack exchange,提问作者Platinumhero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:02:04