Tkinter获取Radiobutton选中值及Entry输入值的实现方法
Tkinter同组单选框的取值逻辑非常明确:所有同组Radiobutton绑定同一个Tkinter变量(StringVar/IntVar等),需要获取选中值时直接调用该变量的.get()方法即可,不需要给每个单选框单独绑定command取值。你的代码存在3个核心问题导致取值、执行逻辑异常:
- 按钮command绑定错误:给Report按钮传入
command=create_frame()时,带括号的写法会在UI初始化阶段立刻执行create_frame函数,而非等待用户点击按钮触发,此时用户还未做任何选择,自然无法拿到有效值。正确写法是直接传入函数对象command=create_frame,不要加括号。 - 单选框冗余代码:你给每个Radiobutton绑定的
command=lambda: r.get()没有实际意义,取到的值既没有存储也没有参与后续逻辑,可以完全删除。 - 数据处理逻辑缺失:调用
df.head()时没有传入输入的提取行数参数,也没有接收返回结果,从Entry输入框拿到的num_rows是字符串类型,直接使用会导致pandas参数类型错误;另外读取.xlsm格式文件需要指定engine='openpyxl',否则后续打包为exe时很容易出现依赖缺失报错。
修正后可直接运行的代码
from tkinter import * import pandas as pd # 初始化主窗口 root = Tk() root.title("Excel数据提取工具") # 绑定单选框选中值的变量,初始状态为无选中 selected_sheet = StringVar() selected_sheet.set(None) # 批量生成工作表选择单选框 for sheet_name in ['A', 'B', 'C', 'D']: Radiobutton(root, text=sheet_name, variable=selected_sheet, value=sheet_name).pack(anchor=NW) # 提取行数输入框 row_input = Entry(root, width=20) row_input.pack(anchor=CENTER) def generate_report(): # 基础参数校验 current_sheet = selected_sheet.get() if not current_sheet: print("请先选择需要读取的工作表") return row_count = row_input.get() if not row_count.isdigit(): print("请输入有效的正整数作为提取行数") return row_count = int(row_count) # 读取Excel并提取指定行数数据 file_path = 'file.xlsm' df = pd.read_excel(file_path, sheet_name=current_sheet, engine='openpyxl') extract_result = df.head(row_count) print(f"成功提取{len(extract_result)}行数据:") print(extract_result) # 生成报告按钮 report_btn = Button(root, text="Report", width=100, command=generate_report) report_btn.pack(anchor=SW) root.mainloop()
打包为单exe的注意事项
使用pyinstaller打包时需要显式指定openpyxl依赖,避免运行时找不到引擎报错,打包命令参考:pyinstaller -F -w your_script_name.py --hidden-import openpyxl
内容的提问来源于stack exchange,提问作者user18977534
相关产品推荐
相关产品推荐

