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

如何修改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界面截图:
Tkinter 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:47:18