如何修改Tkinter的get_user_input()函数以获取所有多行用户输入?
问题描述
我用Tkinter写了一个简化版的GUI用来获取多行用户输入,但get_user_input()函数只能返回最后一行的输入。想重写这个函数,把所有行的输入存入字典或者DataFrame里。
原代码如下:
import tkinter as tk from tkinter import ttk window = tk.Tk() window.title("User Input Window") input_labels = ["Runner", "Course", "Start time","Finish time"] for i, label in enumerate(input_labels): ttk.Label(window, text=label).grid(row=0, column=i, padx=10, pady=5, sticky='s') def get_user_input(): print(f"{runner_entry.get()},{course_entry.get()},{start_time_entry.get()},{finish_time_entry.get()}") for row in range(1, 10): runner_var = tk.StringVar() runner_entry = ttk.Entry(window) runner_entry.grid(row=row, column=0, padx=10, pady=5) course_var = tk.StringVar() course_entry = ttk.Entry(window) course_entry.grid(row=row, column=1, padx=10, pady=5) start_time_var = tk.StringVar() start_time_entry = ttk.Entry(window) start_time_entry.grid(row=row, column=2, padx=10, pady=5) finish_time_var = tk.StringVar() finish_time_entry = ttk.Entry(window) finish_time_entry.grid(row=row, column=3, padx=10, pady=5) submit_button = tk.Button(window, text="Submit", command=get_user_input) submit_button.grid(row=14, column=0, columnspan=2, pady=10) window.mainloop()
GUI界面截图:
问题根源
你循环创建输入框时,每次都会用新的变量覆盖旧的runner_entry、course_entry等,所以最后只能拿到最后一行的输入。解决思路是把每一行的输入控件都存到一个列表里,这样就能遍历所有行获取完整数据。
方案1:将所有输入存入字典
修改代码,把每一行的四个输入框保存到列表中,然后在提交时遍历列表,将数据整理成以标签为键、对应列所有输入为值的字典:
import tkinter as tk from tkinter import ttk window = tk.Tk() window.title("User Input Window") input_labels = ["Runner", "Course", "Start time","Finish time"] for i, label in enumerate(input_labels): ttk.Label(window, text=label).grid(row=0, column=i, padx=10, pady=5, sticky='s') # 存储每一行的输入框控件 input_rows = [] for row in range(1, 10): runner_entry = ttk.Entry(window) runner_entry.grid(row=row, column=0, padx=10, pady=5) course_entry = ttk.Entry(window) course_entry.grid(row=row, column=1, padx=10, pady=5) start_time_entry = ttk.Entry(window) start_time_entry.grid(row=row, column=2, padx=10, pady=5) finish_time_entry = ttk.Entry(window) finish_time_entry.grid(row=row, column=3, padx=10, pady=5) # 将当前行的四个输入框加入列表 input_rows.append([runner_entry, course_entry, start_time_entry, finish_time_entry]) def get_user_input(): # 初始化字典,每个标签对应一个空列表 input_data = {label: [] for label in input_labels} for row_entries in input_rows: # 遍历当前行的每个输入框,获取值并添加到对应列表 for label, entry in zip(input_labels, row_entries): value = entry.get().strip() if value: # 只保留非空输入 input_data[label].append(value) print("存入字典的数据:") print(input_data) submit_button = tk.Button(window, text="Submit", command=get_user_input) submit_button.grid(row=14, column=0, columnspan=2, pady=10) window.mainloop()
方案2:将所有输入存入DataFrame
如果需要用pandas的DataFrame存储数据,只需在上述代码基础上修改提交函数,把收集到的数据转成DataFrame即可(需要先安装pandas:pip install pandas):
import tkinter as tk from tkinter import ttk import pandas as pd window = tk.Tk() window.title("User Input Window") input_labels = ["Runner", "Course", "Start time","Finish time"] for i, label in enumerate(input_labels): ttk.Label(window, text=label).grid(row=0, column=i, padx=10, pady=5, sticky='s') input_rows = [] for row in range(1, 10): runner_entry = ttk.Entry(window) runner_entry.grid(row=row, column=0, padx=10, pady=5) course_entry = ttk.Entry(window) course_entry.grid(row=row, column=1, padx=10, pady=5) start_time_entry = ttk.Entry(window) start_time_entry.grid(row=row, column=2, padx=10, pady=5) finish_time_entry = ttk.Entry(window) finish_time_entry.grid(row=row, column=3, padx=10, pady=5) input_rows.append([runner_entry, course_entry, start_time_entry, finish_time_entry]) def get_user_input(): # 收集所有非空行的数据 rows_data = [] for row_entries in input_rows: row_values = [entry.get().strip() for entry in row_entries] # 只要当前行有一个非空值就加入列表 if any(row_values): rows_data.append(row_values) # 转换为DataFrame df = pd.DataFrame(rows_data, columns=input_labels) print("存入DataFrame的数据:") print(df) submit_button = tk.Button(window, text="Submit", command=get_user_input) submit_button.grid(row=14, column=0, columnspan=2, pady=10) window.mainloop()
内容的提问来源于stack exchange,提问作者hamslice
相关产品推荐
相关产品推荐

