Tkinter如何获取Radiobutton选中值填充MSSQL数据表
代码错误点说明
现有代码的问题集中在5个方面,直接导致取值失败和数据库插入不执行:
- 单选按钮取值方式错误:Tkinter Radiobutton的选中状态存储在绑定的
IntVar变量(即你定义的self.Rvar1)中,Radiobutton组件本身没有get()方法,直接调用self.R1.get()会抛错。 - 逻辑缩进错误:SQL插入代码写在了
return语句之后,无论分支判断走哪条,都会提前退出函数,插入逻辑永远不会被执行。 - 变量未定义:分支判断中使用的
value变量从未赋值,运行时会直接触发NameError。 - 赋值逻辑错误:
gruende = erholungsurlaub = sonderurlaub是连续赋值语法,不是二选一的条件判断,无法拿到正确的休假原因值。 - 边界处理缺失:数据库连接失败时没有终止流程,后续执行游标操作会直接报错;
Text组件取值默认带末尾换行符,没有做空白处理;没有做必填项校验,空值也会尝试写入数据库。
修正后的完整实现
首先在你初始化单选按钮的位置,加一行默认选中配置,避免初始无选中值的问题:
self.Rvar1 = IntVar() self.Rvar1.set(1) # 默认选中常规休假
然后替换submit方法为以下代码:
def submit(self): # 建立数据库连接,失败直接终止提交 try: self.cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};" "Server=SOPCP01DE;" "Database=PulseCoreTest5;" "UID=PCDev2;" "PWD=PCCSDev2PC5_!") self.cursor = self.cnxn.cursor() except Exception as e: print(f"数据库连接失败:{str(e)}") return # 处理起止日期 start_date = self.dDateStart.get().strip() end_date = self.dDateEnd.get().strip() if not start_date: print("必须填写休假开始日期") self.cnxn.close() return if not end_date: end_date = start_date # 按单选按钮选中状态取休假原因 selected_type = self.Rvar1.get() leave_reason = "" if selected_type == 1: leave_reason = "Erholungsurlaub" elif selected_type == 2: special_reason = self.T1.get("1.0", "end").strip() if not special_reason: print("选择特殊休假时必须填写具体原因") self.cnxn.close() return leave_reason = f"Sonderurlaub aufgrund von {special_reason}" else: leave_reason = "Erholungsurlaub" # 执行数据插入 insert_sql = """INSERT INTO dbo.PC_VacationsRequests (dDateStart, dDateEnd, nEmployee, sReasons, sStatus, sStellvertreter) VALUES (?, ?, ?, ?, ?, ?)""" insert_values = ( start_date, end_date, self.nEmployee.get().strip(), leave_reason, "geplant", self.E4.get().strip() ) try: self.cursor.execute(insert_sql, insert_values) self.cnxn.commit() print("休假申请提交成功") except Exception as e: print(f"数据写入失败:{str(e)}") self.cnxn.rollback() finally: self.cnxn.close()
可选优化
可以给两个单选按钮加状态联动:选中常规休假时禁用右侧原因文本框,选中特殊休假时再启用,避免用户误输入,示例逻辑:
def toggle_reason_input(): if self.Rvar1.get() == 2: self.T1.config(state=NORMAL) else: self.T1.config(state=DISABLED) self.T1.delete("1.0", "end") # 初始化Radiobutton时绑定command self.R1 = Radiobutton(self.section3_1, text = "Erholungsurlaub", variable = self.Rvar1, value = 1, command=toggle_reason_input) self.R2 = Radiobutton(self.section3_1, text = "Sonderurlaub aufgrund von", variable = self.Rvar1, value = 2, command=toggle_reason_input) # 初始化时默认禁用文本框 self.T1.config(state=DISABLED)
内容的提问来源于stack exchange,提问作者BobbyPeace420
相关产品推荐
相关产品推荐

