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