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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:15:32