通过Command Button运行两个函数遇TypeError参数缺失求助
解决Tkinter按钮调用函数时的参数缺失问题
错误原因
按钮的command参数中,lambda:[enter_data(),load_data]仅执行了enter_data(),但未将其返回的三个参数传递给load_data(),且load_data只是函数引用而非实际调用,导致触发函数时缺少必填参数。
解决步骤及代码修正
1. 修正按钮的调用逻辑
将按钮的command改为先获取enter_data()的返回值,再将参数传入load_data()执行:
Submit_button=tkinter.Button(frame,text='提交',command= lambda: load_data(*enter_data()))
这里用*将enter_data()返回的元组拆分为三个独立参数,传递给load_data。
2. 修复load_data函数内部错误
- 补充
pd.read_csv的文件路径:从CITY_DATA字典中根据选中城市获取对应CSV文件 - 移除
else分支中无效的df['Start Time'].dt.Selected_Month赋值(语法错误且无意义) - 调整
return df的位置,确保无论是否筛选日期都能返回数据框
修正后的load_data函数:
def load_data (Selected_City,Selected_Month,Selected_Day): # 从CITY_DATA获取对应城市的CSV路径 df=pd.read_csv(CITY_DATA[Selected_City]) df['Start Time']=pd.to_datetime(df['Start Time']) df['month']= df['Start Time'].dt.month df['day_of_week']=df['Start Time'].dt.day_name() if Selected_Month != 'All': months=['January' ,'February','March','April','May','June'] Selected_Month = months.index(Selected_Month)+1 df=df[df['month']==Selected_Month] if Selected_Day !='All': df=df[df['day_of_week']==Selected_Day.title()] return df # 将return放在函数末尾,确保所有分支都能返回df
完整修正代码
import tkinter from tkinter import ttk import pandas as pd CITY_DATA = { 'chicago': 'chicago.csv', 'new york city': 'new_york_city.csv', 'washington': 'washington.csv' } def enter_data(): Selected_City=City_selection_combobox.get() Selected_Month=Month_selection_combobox.get() Selected_Day=Day_selection_combobox.get() return Selected_City, Selected_Month, Selected_Day def load_data (Selected_City,Selected_Month,Selected_Day): df=pd.read_csv(CITY_DATA[Selected_City]) df['Start Time']=pd.to_datetime(df['Start Time']) df['month']= df['Start Time'].dt.month df['day_of_week']=df['Start Time'].dt.day_name() if Selected_Month != 'All': months=['January' ,'February','March','April','May','June'] Selected_Month = months.index(Selected_Month)+1 df=df[df['month']==Selected_Month] if Selected_Day !='All': df=df[df['day_of_week']==Selected_Day.title()] return df window = tkinter.Tk() window.title("数据录入表单") frame=tkinter.Frame(window) frame.pack() User_info_frame = tkinter.LabelFrame(frame,text="用户信息") User_info_frame.grid(row=0,column=0,padx=20,pady=10) City_selection_title = tkinter.Label(User_info_frame,text="请选择城市") City_selection_combobox = ttk.Combobox(User_info_frame,values=['chicago','new york city','washington']) City_selection_title.grid(column=0,row=0) City_selection_combobox.grid(column=0,row=1) Month_selection_title = tkinter.Label(User_info_frame,text="请按月份筛选") Month_selection_combobox = ttk.Combobox(User_info_frame,values=['All' , 'January' , 'February','March','April','May','June']) Month_selection_title.grid(column=1,row=0) Month_selection_combobox.grid(column=1,row=1) Day_selection_title =tkinter.Label(User_info_frame,text="请选择所需日期") Day_selection_combobox =ttk.Combobox(User_info_frame,values=['All' , 'Sunday' , 'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']) Day_selection_title.grid(column=2,row=0) Day_selection_combobox.grid(column=2,row=1) # 修正按钮的command逻辑 Submit_button=tkinter.Button(frame,text='提交',command= lambda: load_data(*enter_data())) Submit_button.grid(row=1,column=0,sticky='news',padx=20,pady=10) window.mainloop()
说明
- 点击按钮时,会先执行
enter_data()获取用户选择的城市、月份、日期,再将这三个参数传递给load_data()执行数据加载与筛选 - 确保CSV文件与代码在同一目录下,或在
CITY_DATA中填写完整文件路径
内容的提问来源于stack exchange,提问作者Ramez Ali
相关产品推荐
相关产品推荐

